Javascript jquery类选择器产生不可用的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

我得到了一个jquery(“#”+id)无法寻址的id。 在文档开始时,我有一个:

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();
        }
    });
}