【发布时间】:2012-08-28 00:25:46
【问题描述】:
我正在尝试制作一个 jQuery ui 日历,以便在单击日期时进行 ajax 调用, 但是几天前我遇到了一个问题。 我发现了一个据说可以执行此操作的代码 sn-p,但我发现它使用 jQuery 自定义选择器。该代码给了我一个错误,所以我开始深入研究自定义选择器以了解有关它们的更多信息。到目前为止,我还无法找出为什么会出现这种奇怪的行为。
这是一张希望澄清问题的图片,我会在它之后解释更多
我已经在控制台输入了
$('.ui-datepicker-calendar td a:test(3)')
正如你所见,我 meta2 和 stack2 是未定义的,还有一件更奇怪的事情,为什么 index2 返回一个 #document ,它应该包含元素数组的索引。
此外,元素 (el2) 甚至都不是正确的元素。 看一下,我叫
$('.ui-datepicker-calendar td a:test(3)')
这应该选择日历中的所有日期,并且在第一个循环中,console.log 应该打印出这个
<td class=" ui-datepicker-week-end " data-handler="selectDay" data-event="click" data-month="8" data-year="2012"><a class="ui-state-default" href="#">1</a></td>
但是我得到了整个文档中的第一个“a”标签,在这种情况下它是上个月的标签(如图所示)。
如果有人能对这种情况有所了解,请做。 哦,还有一件事我忘记了
meta2 ,它应该包含这个
[
':test(argument)', // full selector
'test', // only selector
'', // quotes used
'argument' // parameters
]
在我的情况下,它又是未定义的......
我将分享我的 javascript 代码,希望对您有所帮助
<script>
$(function()
{
$.expr[":"].test = function(el2,index2,meta2,stack2)
{
debugger;
console.log(el2);
console.log(index2);
console.log(meta2);
console.log(stack2);
}
})
$(function()
{
function getJsonDate(year, month)
{
$.getJSON('dates.php?year='+year+'&month='+month, function(data)
{
var i = 0;
for (i = 0; i < data.data.length; i++)
{
debugger;
var myDay = data.data[i]['d'];
$('.ui-datepicker-calendar td a:exactly('+data.data[i]['d']+')')
.css({color: '#f00'})
.attr('href',data.data[i]['link'])
.parent().attr('onclick','');
}
});
}
$.expr[":"].exactly = function(el, index, meta, stack)
{
debugger;
console.log(el);
console.log(index);
console.log(meta);
console.log(stack);
var s = meta[3];
if (!s) return false;
return eval("/^" + s + "$/i").test($(el).text());
};
$('#datepicker').datepicker(
{
inline: true,
onSelect: function(dateText, inst)
{
Date.prototype.toString = function () {return isNaN (this) ? 'NaN' : [this.getDate(), this.getMonth(), this.getFullYear()].join('/')}
d = new Date(dateText);
getJsonDate(d.getFullYear(), d.getMonth()+1);
},
onChangeMonthYear: function(year, month, inst)
{
//alert(year);
//alert(month);
getJsonDate(year, month);
}
});
});
</script>
【问题讨论】:
-
我今天早上遇到了同样的问题,花了 2 小时,对我来说 meta 仍然是未定义的。以前工作得很好,如果你发现了什么,请让我更新。谢谢。
-
你好@JakubKuchar,我没能让它工作,所以我做了一个解决方法并选择了我需要其他方式的元素。但我仍然很想知道答案。
-
Sizzle 在 jQuery 1.8 中进行了更新,导致自定义选择器创建的语法发生重大变化。请查看 sizzle 文档以获取更多信息。 github.com/jquery/sizzle/wiki/Sizzle-Documentation 看来如果你升级到 jQuery 1.8.1,旧的选择器将再次工作。
-
请同时发布您的 HTML。