【问题标题】:jQuery and object literal function not working togetherjQuery 和对象文字函数不能一起工作
【发布时间】:2012-12-23 16:40:57
【问题描述】:


我试图组织我的 jquery 代码,所以我创建了一个对象文字,但现在 focusTextArea 不起作用,我的 textarea 值没有更新。

感谢您的帮助。

html

<textarea id="test"></textarea>​


javascript
(function($,window,document,undefined){

    var TEX = {

        inputField: $("textarea#test"),

        /* Init all functions */
        init: function()
        {
            this.focusTextArea();
        },

        /* Function update textarea */
        focusTextArea:  function()
        {
            this.inputField.text('test');
        },
    }

    $(document).ready(function(){
        TEX.init();
    });

})(jQuery,window,document);​


jsfiddle http://jsfiddle.net/vBvZ8/1/

【问题讨论】:

标签: javascript jquery oop


【解决方案1】:

首先,您没有在小提琴中正确包含 jQuery。另外,我认为您的意思是将代码放在文档的head 中(因为document.ready 处理程序)。

更重要的是,选择器$("textarea#test") 可能在文档准备就绪之前运行,因此实际上不会正确找到元素。我建议在TEX.init 中分配inputField

(function($,window,document,undefined){

    var TEX = {

        /* Init all functions */
        init: function()
        {
            this.inputField = $("#test");
            this.focusTextArea();
        },

        /* Function update textarea */
        focusTextArea:  function()
        {
            this.inputField.text('test');
        },
    }

    $(document).ready(function(){
        TEX.init();
    });

})(jQuery,window,document);​

更新示例: http://jsfiddle.net/xntA2/1/

作为旁注,textarea#test 应仅更改为 #testtextarea 位是多余的,因为页面上应该只有一个元素带有 id=test

【讨论】:

  • 假设不正确,因为jQuery 是自执行函数的参数...所有插件都使用相同的包装器
  • 假设代码在 DOM 准备好之前运行...工作正常jsfiddle.net/vBvZ8/4
  • 要点——尽管我认为 OP 打算将他的所有代码都包含在 head 中,因为 document.ready 处理程序。如果您将小提琴更改为使用nowrap (head)(在实际场景中更有可能),则代码将不起作用。不过我会更新我的答案。
  • 好的...我猜它不像插件一样工作...我确实在小提琴中随意选择了no wrap body
  • 其他选择是定义函数全局而不是在自执行函数中,或者在$.fn中定义为插件
【解决方案2】:

避免在元素存在之前查找元素的替代语法是从函数中返回元素:

(function($,window,document,undefined){

    var TEX = {
        /* function won't look for element until called*/
        inputField:function(){
            return $("textarea#test")
       }, 
        init: function()
        {
            this.focusTextArea();
        },
        focusTextArea:  function()
        {
            this.inputField().text('test');
        },
    }

    $(document).ready(function(){
        TEX.init();
    });

})(jQuery,window,document);

演示:http://jsfiddle.net/vBvZ8/5/

我意识到这是一个简化的示例...但是您也非常接近创建 jQuery 插件,这也可能是有益的。以下提供与示例相同的功能:

(function($, window, document, undefined) {    
    $.fn.focusTextArea = function() {
        return this.each(function(){
            $(this).text('test');
        })        
    };    
})(jQuery, window, document);

$(function() {
    $('textarea').focusTextArea()
});

演示:http://jsfiddle.net/vBvZ8/8/

【讨论】:

  • 是不是有点多余,因为每次想要获取属性时都必须查询 DOM?抱歉,我对所有这些 OOP 东西都不熟悉
猜你喜欢
  • 2017-10-14
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多