2014-03-27 58 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