Javascript jquery类选择器产生不可用的id
我得到了一个jquery(“#”+id)无法寻址的id。 在文档开始时,我有一个:Javascript jquery类选择器产生不可用的id,javascript,jquery,selector,Javascript,Jquery,Selector,我得到了一个jquery(“#”+id)无法寻址的id。 在文档开始时,我有一个: var g_justClicked = ''; $.ajaxSetup({ beforeSend:function(event){ if(g_justClicked) { console.log('g_justClicked='+g_justClicked+' tagName='+$('#'+g_justClicked).tagName); }; v
var g_justClicked = '';
$.ajaxSetup({
beforeSend:function(event){
if(g_justClicked) {
console.log('g_justClicked='+g_justClicked+' tagName='+$('#'+g_justClicked).tagName);
};
var wOffset = $('#'+g_justClicked).offset();
$('#loading').show();
},
complete:function(){
$('#loading').hide();
}
});
在文档末尾,我有另一个脚本(所有带有类微调器的元素都应该设置全局变量“g_justClicked”):
这工作正常,变量已在ajaxSetup中正确设置和显示
但是:在tagName=或wOffset=中使用
$('#'+g_justClicked).
导致
“类型错误:wOffset/标记名未定义”
注意:所有id都以几个字符开头,例如,“boxshow12345”是一个典型的id
我做错了什么?我想我可以在这里重现你的情景: 您的
控制台.log中的未定义
是因为您正在访问一个不存在的jQuery属性:.tagName
。此属性仅对本机可用
要从jQuery对象检索标记名,应使用:.prop(“标记名”)
,或使用$(“#”+g_justClicked)[0]访问本机元素的属性。标记名
所以,如果你改变
console.log('g_justClicked='+g_justClicked+' tagName='+$('#'+g_justClicked).tagName);
致:
将成功记录:g_justClicked=boxshow12345标记名=按钮,如预期的那样
注意:为了使逻辑工作,您必须首先单击.spinner
。您的问题是,无论您在单击处理程序中执行什么操作,ajax安装程序都会运行,而且它在您设置该处理程序之前就运行了。g_justClicked
的初始值为空字符串,这是它在$(“#”+g_justClicked)
中尝试访问的内容,因此出现错误
如果要单击微调器,然后在发送前将id传递给
,请执行以下操作:
$(document).ready(function() {
$('.spinner').click(function() {
var g_justClicked = this.id; //simplify this a bit
console.log('.spinner.click: g_justClicked=' + g_justClicked);
// call ajax
_setupAjax( g_justClicked );
});
});
function _setupAjax(g_justClicked) {
$.ajaxSetup({
beforeSend: function(event) {
if (g_justClicked) {
console.log('g_justClicked=' + g_justClicked + ' tagName=' + $('#' + g_justClicked).tagName);
};
var wOffset = $('#' + g_justClicked).offset();
$('#loading').show();
},
complete: function() {
$('#loading').hide();
}
});
}
更新
如果不需要单独的函数,只需将ajax设置移动到click处理程序中:
$(document).ready(function() {
$('.spinner').click(function() {
var g_justClicked = this.id; //simplify this a bit
console.log('.spinner.click: g_justClicked=' + g_justClicked);
// call ajax setup
$.ajaxSetup({
beforeSend: function(event) {
if (g_justClicked) {
console.log('g_justClicked=' + g_justClicked + ' tagName=' + $('#' + g_justClicked).tagName);
};
var wOffset = $('#' + g_justClicked).offset();
$('#loading').show();
},
complete: function() {
$('#loading').hide();
}
});
});
});
好的@mrlew。
回答:我试过你的.prop方法,但仍然得到“未定义”。现在回到根源:
目标是在ajax运行时获取被单击以修改繁忙指示器位置的任何元素的id。最近,我回到了我原来的方法,没有全局变量和参数传递:
$(document).ready(function () {
$('.spinner').click(function() {
_setupAjax();
});
});
哪些有效,以及:
function _setupAjax() {
$.ajaxSetup({
beforeSend: function() {
$('#loading').show();
wJustClicked = $(this).attr('id'); /// <- that doesnt work!
console.log("_setupAjax wJustClicked="+wJustClicked);
console.log('_setupAjax tagName=' + $('#' + wJustClicked).prop("tagName"));
....defining css based on id (no problem)..
function\u setupAjax(){
$.ajaxSetup({
beforeSend:function(){
$(“#加载”).show();
wJustClicked=$(this.attr('id');//@mrlew
非常感谢您的帮助。与此同时,我找到了解决方案。所有的麻烦都来自于时间问题。以下是有效的方法(对于class=spinner的所有DIV、SPAN和IMG,并具有id:
$(document).ready(function () {
_setupAjax();
$('.spinner').click(function() {
wJustClicked = $(this).attr('id');
if(wJustClicked == null) alert('Id missing on item clicked');
console.log('.spinner.click! id='+wJustClicked);
var wOffset = $('#' + wJustClicked).offset();
var xPos = Math.round(wOffset.left) + 8;
var yPos = Math.round(wOffset.top) + 4;
console.log(wJustClicked+' offset left='+wOffset.left+' top='+wOffset.top+' xPos='+xPos+' yPos='+yPos);
wDiv = 'loading';
$('#'+wDiv).css('left',xPos);
$('#'+wDiv).css('top',yPos);
});
和js函数:
function _setupAjax() {
$.ajaxSetup({
beforeSend: function() {
$('#loading').show();
},
complete: function() {
$('#loading').hide();
}
});
}
还有一件奇怪的事情(我安装了firebug),我已经用数学解决了。圆:x和y的位置太复杂了,比如170.5134577和434.8768664?!?
我可以接受。但是这种伪精度是从哪里来的呢?
再次感谢您让我的希望保持正直。因为您在闭包中声明变量,看起来像是这样。它是未定义的,因为您只在ajaxSetup中定义它。在ajax调用之外声明变量,然后您应该能够稍后引用它们。就像您在开始时使用var g_justClicked='';一样。您正在访问标记名
和wOffset
?谢谢你们!我一直知道这是一个计时问题,但不知道如何管理它。在@Nikolay Ermakov解决方案中,我不理解的是:您定义了一个函数_setupAjax。但是它被触发/调用了吗?请随意建议另一个没有单独函数的解决方案,其中d直接在beforeSend之后:拾取最后单击的元素的id,但仅当其类为“微调器”时不管元素标记是什么,在我的例子中可能是SPAN、DIV和IMG。您好!如果您喜欢的话,我将函数内容移动到了click处理程序中。如果单击任何带有类微调器的元素,它都会被触发。Thanx,尝试了两者,但对我来说都不起作用。现在最先进的技术是:1.仅在initilaiz中使用snippleting g_justClicked=“”.2.将脚本放在.js文件中。3.文档。仍然在文档末尾准备就绪:console.log('document ready!!');$('.spinner')。单击(function(){g_justClicked=$(this.attr('id');console.log('.spinner.click:g_justClicked='+g_justClicked);\u setupAjax(g_justClicked););现在我已经删除了a)头脚本中的初始化,因为不再需要,以及b)事件在beforeSend的括号中,因为它从未被使用过。结果是一样的。最终我误导了大家。我的初衷是让id在beforeSend之后直接获取。但我的方法不起作用,只有通过使用外部函数的方法才起作用。因此,如果您知道如何从re,我会满意的。谢谢你;我试过了,但是没有用。请看@Nikolay Ermakov的答案中的详细内容。@Beckermint你能更具体地说什么没有用吗?你试过上面的小提琴吗?体验过什么行为?它运行没有错误。答:@mrlew回答:我试过你的.prop方法,但仍然是“未定义的”现在回到根:目标是在ajax运行时获取被单击以修改繁忙指示器位置的类微调器的任何元素的id。最近,我回到了我原来的方法,没有传递全局变量和参数:OK2:$(文档)。就绪(函数(){$('.spinner')。单击(函数(){setupAjax();});});它可以工作,并且:OK3:function{setupAjax(){$.ajaxSetup({beforeSend:function(){$('#加载').show();wJustClicked=$(this.attr('id')///
$(document).ready(function () {
_setupAjax();
$('.spinner').click(function() {
wJustClicked = $(this).attr('id');
if(wJustClicked == null) alert('Id missing on item clicked');
console.log('.spinner.click! id='+wJustClicked);
var wOffset = $('#' + wJustClicked).offset();
var xPos = Math.round(wOffset.left) + 8;
var yPos = Math.round(wOffset.top) + 4;
console.log(wJustClicked+' offset left='+wOffset.left+' top='+wOffset.top+' xPos='+xPos+' yPos='+yPos);
wDiv = 'loading';
$('#'+wDiv).css('left',xPos);
$('#'+wDiv).css('top',yPos);
});
function _setupAjax() {
$.ajaxSetup({
beforeSend: function() {
$('#loading').show();
},
complete: function() {
$('#loading').hide();
}
});
}