2014-03-27 31 views
0

这是代码的一个非常简化的版本来解释我的问题。jquery对象不能作为全局变量工作

HTML:

<input type="radio" name="enableDisableBox" id="radioDisable" checked="checked" /> 
Disable 
<br /> 
<input type="radio" name="enableDisableBox" id="radioEnable" /> 
Enable 
<br /> 
<input type="text" id="txtUserInput" disabled="disabled" /> 

的JavaScript:

var txtInputObj2 = $("#txtUserInput"); 

function init1() { 
    var txtInputObj1 = $("#txtUserInput"); 
    $("input[name='enableDisableBox']:radio").change(function() { 
     if ($("#radioEnable").attr("checked")) 
      txtInputObj1.removeAttr("disabled").focus(); 
     else 
      txtInputObj1.attr("disabled", "disabled"); 
    }); 
} 

function init2() { 
    $("input[name='enableDisableBox']:radio").change(function() { 
     if ($("#radioEnable").attr("checked")) 
      txtInputObj2.removeAttr("disabled").focus(); 
     else 
      txtInputObj2.attr("disabled", "disabled"); 
    }); 
} 

$(document).ready(function() { 
    init1(); 
    //init2(); 
}); 

如果我运行INIT2功能,它并没有给我任何的错误,但不启用或禁用任何文本框我。

如果您注意到,txtInputObj1在init1函数中定义,并且txtInputObj2被定义为全局变量。

关于如何使jQuery选择器对象全局的任何建议?

+1

在DOM准备好之前,您正在执行'$(“#txtUserInput”)'*'。该元素尚不存在。 –

+0

你在哪里声明你的jQuery?我见过一些人在html脚本的底部删除了jQuery(通常在''之前,我通常练习这种方法来处理所有的javascript文件,除了jQuery,因为我总是在我的''中使用它,这让我jQuery的全局能力 – Faron

+0

它被定义在头部分 – TK1

回答

3

var txtInputObj2 = $("#txtUserInput");在DOM就绪处理程序之外运行,因此该元素当时不可用,否则它会起作用。

编辑:

在我看来,这是一个坏主意,但是这是你会怎么做你问什么。 首先声明变量,或者声明其作为全球性的,并设定值时,DOM是准备

var txtInputObj2; 

function init2() { 
    $("input[name='enableDisableBox']:radio").change(function() { 
     if ($("#radioEnable").attr("checked")) 
      txtInputObj2.removeAttr("disabled").focus(); 
     else 
      txtInputObj2.attr("disabled", "disabled"); 
    }); 
} 

$(document).ready(function() { 
    txtInputObj2 = $("#txtUserInput"); 

    // could also do window.txtInputObj2 without the previous decleration 

    init1(); 
    init2(); 
}); 
+0

,因为我想在同一个js文件的另一个函数中使用同一个jQuery对象,一旦我选择了这个对象,为什么我需要再次选择它呢? – TK1

+0

@ TK1 - 基本上,如果你需要一个元素作为一个全局变量,在许多情况下,你做错了什么,但无论如何,添加一个答案,完全符合你的要求。 – adeneo

+0

好吧,这对我有用......但请你详细说明为什么这是一个坏主意?我正在学习! – TK1

2

DEMO
为什么不一样的东西:

// function outside DOM ready 
function init() { 
    $(":radio[name='enableDisableBox']").change(function() { 
     $('#txtUserInput').prop('disabled', this.id=="radioDisable").focus(); 
    }); 
} 

$(function() { // DOM IS NOW READY 

    init(); // Function called inside DOM ready so all fine! 
    // OTHER CODE HERE 

}); 

如果您想创建一个可重复使用的var来存储你可以做的元素:

// function outside DOM ready 
function init(elemSelector) { // NOTE the elemSelector argument! 
    $(":radio[name='enableDisableBox']").change(function() { 
     elemSelector.prop('disabled', this.id=="radioDisable").focus(); 
    }); 
} 

$(function() { // DOM IS NOW READY 
    var myInput = $('#txtUserInput'); // Reusable element variable 
    init(myInput); // send your var as an argument to your fn. 
    // OTHER CODE HERE 
    // Reuse myInput variable as your element selector if needed like: 
    // myInput.blur(); 
}); 
+0

我想创建一个全局变量,我可以在同一个js文件中使用不同的函数以及...不幸的是,这个解决方案不适合我。 – TK1

+0

@ TK1编辑我的答案为一个简单的解决方案。 –

+0

@ TK1主要目标是确保您的jQuery元素选择器像ie:'$('#someElement')'在类似'$(function(){/ * here * /})的DOM就绪函数中读取;''或者你需要调用一个外部函数,让你的选择器使用它!这个问题主要发生在''中使用'

  • 11. jQuery数据()不能全局工作
  • 12. 全局jQuery对话框变量无法正常工作
  • 13. 将jquery对象分配给变量不能按预期工作
  • 14. 如何传递对象作为全局变量列表在python
  • 15. jQuery Mobile中的全局变量不再工作
  • 16. Python全局对象变量
  • 17. 对象的全局变量
  • 18. Javascript全局变量不能正常工作
  • 19. VB.net全局变量不能正常工作?
  • 20. 全局变量不能在Python/Django中工作?
  • 21. nodejs全局变量不能按预期工作
  • 22. 全局变量不能按预期工作
  • 23. 全局变量不能在php5.6中工作
  • 24. 全局变量不能在匿名函数内工作
  • 25. 的JavaScript功能更新全局变量不工作
  • 26. 功能范围内的全局变量不工作 - async.series
  • 27. Python全局变量不能在递归函数中工作
  • 28. 面向对象编程 - 作为成员的变量或仅作为全局变量的头部变量?
  • 29. Javascript全局变量或对象变量
  • 30. 如何使用对象变量作为全局/公共变量的Android