Skip to content

Commit ddaed1c

Browse files
Arknistaabm
authored andcommitted
Core: assign rules to contenteditable via .validate() and .rules() (jquery-validation#1947)
Fixes jquery-validation#1946
1 parent cf925cf commit ddaed1c

File tree

3 files changed

+69
-1
lines changed

3 files changed

+69
-1
lines changed

src/core.js

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,16 @@ $.extend( $.fn, {
121121
settings, staticRules, existingRules, data, param, filtered;
122122

123123
// If nothing is selected, return empty object; can't chain anyway
124-
if ( element == null || element.form == null ) {
124+
if ( element == null ) {
125+
return;
126+
}
127+
128+
if ( !element.form && element.hasAttribute( "contenteditable" ) ) {
129+
element.form = this.closest( "form" )[ 0 ];
130+
element.name = this.attr( "name" );
131+
}
132+
133+
if ( element.form == null ) {
125134
return;
126135
}
127136

@@ -384,6 +393,7 @@ $.extend( $.validator, {
384393
// Set form expando on contenteditable
385394
if ( !this.form && this.hasAttribute( "contenteditable" ) ) {
386395
this.form = $( this ).closest( "form" )[ 0 ];
396+
this.name = $( this ).attr( "name" );
387397
}
388398

389399
var validator = $.data( this.form, "validator" ),
@@ -620,6 +630,7 @@ $.extend( $.validator, {
620630
// Set form expando on contenteditable
621631
if ( this.hasAttribute( "contenteditable" ) ) {
622632
this.form = $( this ).closest( "form" )[ 0 ];
633+
this.name = name;
623634
}
624635

625636
// Select only the first element for each name, and only those with rules specified

test/index.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,11 @@ <h3></h3>
439439
<input name="year"/>
440440
<button name="submitForm27" value="someValue" type="submit"><span>Submit</span></button>
441441
</form>
442+
<form id="_contenteditableForm">
443+
<div name="first_name" id="first_name" contenteditable placeholder="First Name"></div>
444+
<br>
445+
<input type="text" name="something" id="_something" />
446+
</form>
442447
</div>
443448
</body>
444449
</html>

test/test.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1262,6 +1262,58 @@ QUnit.test( "works on contenteditable fields on input event", function( assert )
12621262
assert.noErrorFor( $( "#contenteditableRequiredValid" ) );
12631263
} );
12641264

1265+
QUnit.test( "Assign rules to contenteditable via .validate() method", function( assert ) {
1266+
assert.expect( 2 );
1267+
var form = $( "#_contenteditableForm" );
1268+
var v = form.validate( {
1269+
rules: {
1270+
first_name: {
1271+
required: true
1272+
},
1273+
something: {
1274+
required: true
1275+
}
1276+
}
1277+
} );
1278+
var firstNameRules = $( "#first_name", form ).rules();
1279+
var expectedRules = { required: true };
1280+
1281+
assert.deepEqual(
1282+
firstNameRules, expectedRules, "The rules should be the same"
1283+
);
1284+
1285+
v.form();
1286+
1287+
assert.equal( v.numberOfInvalids(), 2, "The form has two errors" );
1288+
} );
1289+
1290+
QUnit.test( "Assign rules to contenteditable via .rules() method", function( assert ) {
1291+
assert.expect( 2 );
1292+
var form = $( "#_contenteditableForm" );
1293+
var v = form.validate( {
1294+
rules: {
1295+
something: {
1296+
required: true
1297+
}
1298+
}
1299+
} );
1300+
1301+
$( "#first_name", form ).rules( "add", {
1302+
required: true
1303+
} );
1304+
1305+
var firstNameRules = $( "#first_name", form ).rules();
1306+
var expectedRules = { required: true };
1307+
1308+
assert.deepEqual(
1309+
firstNameRules, expectedRules, "The rules should be the same"
1310+
);
1311+
1312+
v.form();
1313+
1314+
assert.equal( v.numberOfInvalids(), 2, "The form has two errors" );
1315+
} );
1316+
12651317
QUnit.module( "misc" );
12661318

12671319
QUnit.test( "success option", function( assert ) {

0 commit comments

Comments
 (0)