Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit13a870b

Browse files
authored
Selector: Re-expose jQuery.find.tokenize (3.x version)
`Sizzle.tokenize` is an internal Sizzle API, but exposed. As a result,it has historically been available in jQuery via `jQuery.find.tokenize`.That got dropped during Sizzle removal; this change restores the API.In addition to that, Sizzle tests have been backported for the followingAPIs:* `jQuery.find.matchesSelector`* `jQuery.find.matches`* `jQuery.find.compile`* `jQuery.find.select`A new test was also added for `jQuery.find.tokenize` - even Sizzle wasmissing one.Fixesgh-5259Closesgh-5260Refgh-5263Refjquery/sizzle#242Refgh-5113Refgh-4395Refgh-4406
1 parent992a665 commit13a870b

File tree

2 files changed

+232
-3
lines changed

2 files changed

+232
-3
lines changed

‎src/selector.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2091,12 +2091,12 @@ jQuery.find = find;
20912091
jQuery.expr[":"]=jQuery.expr.pseudos;
20922092
jQuery.unique=jQuery.uniqueSort;
20932093

2094-
// These have always been private, but they used to be documented
2095-
// as part of Sizzle so let's maintain them in the 3.x line
2096-
// for backwards compatibility purposes.
2094+
// These have always been private, but they used to be documented as part of
2095+
// Sizzle so let's maintain them for now for backwards compatibility purposes.
20972096
find.compile=compile;
20982097
find.select=select;
20992098
find.setDocument=setDocument;
2099+
find.tokenize=tokenize;
21002100

21012101
find.escape=jQuery.escapeSelector;
21022102
find.getText=jQuery.text;

‎test/unit/selector.js

Lines changed: 229 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2448,3 +2448,232 @@ QUnit[ QUnit.jQuerySelectors ? "test" : "skip" ]( "Ensure no 'undefined' handler
24482448
assert.ok(!jQuery.expr.attrHandle.hasOwnProperty("undefined"),
24492449
"Extra attr handlers are not added to Expr.attrHandle (https://github.com/jquery/sizzle/issues/353)");
24502450
});
2451+
2452+
QUnit.test("jQuery.find.matchesSelector",function(assert){
2453+
assert.expect(15);
2454+
2455+
varlink=document.getElementById("simon1"),
2456+
input=document.getElementById("text1"),
2457+
option=document.getElementById("option1a"),
2458+
disconnected=document.createElement("div");
2459+
2460+
link.title="Don't click me";
2461+
assert.ok(jQuery.find.matchesSelector(link,"[rel='bookmark']"),"attribute-equals string");
2462+
assert.ok(jQuery.find.matchesSelector(link,"[rel=bookmark]"),"attribute-equals identifier");
2463+
assert.ok(jQuery.find.matchesSelector(link,"[\nrel = bookmark\t]"),
2464+
"attribute-equals identifier (whitespace ignored)");
2465+
assert.ok(jQuery.find.matchesSelector(link,"a[title=\"Don't click me\"]"),
2466+
"attribute-equals string containing single quote");
2467+
2468+
// trac-12303
2469+
input.setAttribute("data-pos",":first");
2470+
assert.ok(jQuery.find.matchesSelector(input,"input[data-pos=\\:first]"),
2471+
"attribute-equals POS in identifier");
2472+
assert.ok(jQuery.find.matchesSelector(input,"input[data-pos=':first']"),
2473+
"attribute-equals POS in string");
2474+
if(QUnit.jQuerySelectors){
2475+
assert.ok(jQuery.find.matchesSelector(input,":input[data-pos=':first']"),
2476+
"attribute-equals POS in string after pseudo");
2477+
}else{
2478+
assert.ok("skip",":input not supported in selector-native");
2479+
}
2480+
2481+
option.setAttribute("test","");
2482+
assert.ok(jQuery.find.matchesSelector(option,"[id=option1a]"),
2483+
"id attribute-equals identifier");
2484+
if(QUnit.jQuerySelectors){
2485+
assert.ok(jQuery.find.matchesSelector(option,"[id*=option1][type!=checkbox]"),
2486+
"attribute-not-equals identifier");
2487+
}else{
2488+
assert.ok("skip","[key!=value] not supported in selector-native");
2489+
}
2490+
assert.ok(jQuery.find.matchesSelector(option,"[id*=option1]"),"attribute-contains identifier");
2491+
assert.ok(!jQuery.find.matchesSelector(option,"[test^='']"),
2492+
"attribute-starts-with empty string (negative)");
2493+
2494+
option.className="=]";
2495+
assert.ok(jQuery.find.matchesSelector(option,".\\=\\]"),
2496+
"class selector with attribute-equals confusable");
2497+
2498+
assert.ok(jQuery.find.matchesSelector(disconnected,"div"),"disconnected element");
2499+
assert.ok(jQuery.find.matchesSelector(link,"* > *"),"child combinator matches in document");
2500+
assert.ok(!jQuery.find.matchesSelector(disconnected,"* > *"),"child combinator fails in fragment");
2501+
});
2502+
2503+
QUnit.test("jQuery.find.matches",function(assert){
2504+
assert.expect(4);
2505+
2506+
variframeChild,
2507+
input=document.getElementById("text1"),
2508+
div=document.createElement("div"),
2509+
iframe=document.getElementById("iframe"),
2510+
iframeDoc=iframe.contentDocument||iframe.contentWindow.document;
2511+
2512+
assert.deepEqual(jQuery.find.matches("input",[input]),[input],
2513+
"jQuery.find.matches with seed of input element");
2514+
assert.deepEqual(jQuery.find.matches("div",[div]),[div],
2515+
"jQuery.find.matches with disconnected element");
2516+
2517+
iframeDoc.open();
2518+
iframeDoc.write("<body><div id='foo'><div id='bar'></div></div></body>");
2519+
iframeDoc.close();
2520+
2521+
iframeChild=iframeDoc.getElementById("bar");
2522+
2523+
assert.deepEqual(
2524+
jQuery.find.matches(":root > body > #foo > #bar",[iframeChild]),
2525+
[iframeChild],
2526+
"jQuery.find.matches infers context from element"
2527+
);
2528+
2529+
assert.deepEqual(
2530+
jQuery.find.matches(":root *",[div,iframeChild,input]),
2531+
[iframeChild,input],
2532+
"jQuery.find.matches infers context from each seed element"
2533+
);
2534+
});
2535+
2536+
QUnit[QUnit.jQuerySelectors ?"test" :"skip"]("jQuery.find.select with pre-compiled function",function(assert){
2537+
assert.expect(6);
2538+
2539+
supportjQuery.each([
2540+
"#qunit-fixture #first",
2541+
"ol#listWithTabIndex > li[tabindex]",
2542+
"#liveSpan1"
2543+
],function(i,selector){
2544+
varcompiled=jQuery.find.compile(selector);
2545+
assert.equal(jQuery.find.select(compiled,document).length,
2546+
1,"Should match using a compiled selector function");
2547+
assert.equal(
2548+
jQuery.find.select(compiled,jQuery("#first")[0]).length,
2549+
0,"Should not match with different context");
2550+
});
2551+
});
2552+
2553+
// Internal, but we test it for backwards compatibility for edge cases
2554+
QUnit[QUnit.jQuerySelectors ?"test" :"skip"]("jQuery.find.tokenize",function(assert){
2555+
assert.expect(1);
2556+
2557+
varselector="#id .class > div[prop=\"value\"] + input:nth-child(1):button, span:contains(\"Text\") ~ div:has(div:has(span)):not(.not-this.not-that > div)",
2558+
tokens=[
2559+
[
2560+
{
2561+
"value":"#id",
2562+
"type":"ID",
2563+
"matches":[
2564+
"id"
2565+
]
2566+
},
2567+
{
2568+
"value":" ",
2569+
"type":" "
2570+
},
2571+
{
2572+
"value":".class",
2573+
"type":"CLASS",
2574+
"matches":[
2575+
"class"
2576+
]
2577+
},
2578+
{
2579+
"value":" > ",
2580+
"type":">"
2581+
},
2582+
{
2583+
"value":"div",
2584+
"type":"TAG",
2585+
"matches":[
2586+
"div"
2587+
]
2588+
},
2589+
{
2590+
"value":"[prop=\"value\"]",
2591+
"type":"ATTR",
2592+
"matches":[
2593+
"prop",
2594+
"=",
2595+
"value"
2596+
]
2597+
},
2598+
{
2599+
"value":" + ",
2600+
"type":"+"
2601+
},
2602+
{
2603+
"value":"input",
2604+
"type":"TAG",
2605+
"matches":[
2606+
"input"
2607+
]
2608+
},
2609+
{
2610+
"value":":nth-child(1)",
2611+
"type":"CHILD",
2612+
"matches":[
2613+
"nth",
2614+
"child",
2615+
"1",
2616+
0,
2617+
1,
2618+
undefined,
2619+
"",
2620+
"1"
2621+
]
2622+
},
2623+
{
2624+
"value":":button",
2625+
"type":"PSEUDO",
2626+
"matches":[
2627+
"button",
2628+
undefined
2629+
]
2630+
}
2631+
],
2632+
[
2633+
{
2634+
"value":"span",
2635+
"type":"TAG",
2636+
"matches":[
2637+
"span"
2638+
]
2639+
},
2640+
{
2641+
"value":":contains(\"Text\")",
2642+
"type":"PSEUDO",
2643+
"matches":[
2644+
"contains",
2645+
"Text"
2646+
]
2647+
},
2648+
{
2649+
"value":" ~ ",
2650+
"type":"~"
2651+
},
2652+
{
2653+
"value":"div",
2654+
"type":"TAG",
2655+
"matches":[
2656+
"div"
2657+
]
2658+
},
2659+
{
2660+
"value":":has(div:has(span))",
2661+
"type":"PSEUDO",
2662+
"matches":[
2663+
"has",
2664+
"div:has(span)"
2665+
]
2666+
},
2667+
{
2668+
"value":":not(.not-this.not-that > div)",
2669+
"type":"PSEUDO",
2670+
"matches":[
2671+
"not",
2672+
".not-this.not-that > div"
2673+
]
2674+
}
2675+
]
2676+
];
2677+
2678+
assert.deepEqual(jQuery.find.tokenize(selector),tokens,"Tokenization successful");
2679+
});

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp