【问题标题】:How can this jQuery script be written better? [closed]怎样才能更好地编写这个 jQuery 脚本? [关闭]
【发布时间】:2013-10-18 21:07:32
【问题描述】:

下面是工作脚本。

<script type="text/javascript">
window.lang = new jquery_lang_js();
$(document).ready(function() {  
    window.lang.run();
 $(".jp").click(function (e) {
 e.preventDefault();      
    var $this = $(this);        
    var id = $this.attr('href');
    window.lang.change('jp');
});

 $(".en").click(function (e) {
 e.preventDefault();      
    var $this = $(this);        
    var id = $this.attr('href');
    window.lang.change('en');
});
});

</script>

<a href="#" class="en">Switch to English</a>
<a href="#" class="jp">Switch to Japanese</a>

//////////////////////////////////

现在,在快速告诉我“如果它有效的话有什么问题?”我还有几个课程要添加,所以我试图摆脱冗余。我知道如何将 href 与相同的函数结合起来,但在这里,每个类都有可变函数,我自己无法弄清楚。

这是我迄今为止尝试过的。

<script type="text/javascript">
window.lang = new jquery_lang_js();
$(document).ready(function() {  
    window.lang.run();
  $this.each(function(){ 
 $("a").click(function (e) {
 e.preventDefault();      
  // var $this = $(this);       
    var id = $this.attr('href');
    window.lang.change('jp');
    window.lang.change('en');
});
});
});

</script>

这是行不通的。

并且评论说我应该先学习 jQuery 的基础知识然后在这里提问只是因为我不能替换 var $this = $(this); 是不是有点苛刻。到 $this.each(function(){ 正确吗?

我是 jQuery 新手,我想通过在这里提问来学习。说我应该先学习基础知识并不是很有建设性。如果你没有帮助那么好,但所有这些批评是为了什么?

【问题讨论】:

  • 这可能更适合codereview.stackexchange.com
  • 如果用$(this) 代替$this 有问题,我建议你退后一步,开始学习JavaScript/jQuery 的基础知识。
  • 他现在可以学习了!为什么要把他送走..? var $this=$(this) 如果您在该范围内不止一次需要它,它会让事情变得更好。所以你是对的,在你的代码中你不需要它看起来像。
  • 这是最好的 jQuery 资源顺便说一句,玩得开心^^ tutsplus.com/course/30-days-to-learn-jquery

标签: jquery variables href


【解决方案1】:

我喜欢在这种场景中使用数据属性...

var lang = new jquery_lang_js();
$(function() {  
    lang.run();

    $(".lang").click(function (e) {
        var ln = $( this ).data( "lang" );

        if ( ln ) { 
            lang.change( ln );
        }

        e.preventDefault();
    });
});


<a href="#" class="lang" data-lang="en">Switch to English</a>
<a href="#" class="lang" data-lang="jp">Switch to Japanese</a>

另外,关于this,在这样的事件监听器的回调中,它将引用被点击的实际DOM元素。您可以使用该 DOM 元素并用 $( this ) 包装它,它基本上为您提供了一个包含单击元素的 jQuery 对象。

【讨论】:

  • 应该使用 .attr('data-whatever') 以获得更好的兼容性
  • @Huangism 我相信.data 兼容大多数浏览器,甚至是旧的。
  • 谢谢。这行得通,我看到你在这里做什么。 (好吧,让我通过说我认为我理解你在做什么来获得资格。)我通过看例子来学习,这非常有帮助。非常感谢。
  • 甜,没问题的人。前几天我写了一篇关于this的文章,如果您想了解更多知识...tech.pro/tutorial/1192/avoiding-the-this-problem-in-javascript
  • 我刚刚为您的文章添加了书签,并计划与正在学习 jQuery 的其他人分享您的文章。感谢您分享您的知识。
【解决方案2】:

我想澄清一下$this = $(this); 的一般用法以及您对它的使用。

使用$(this) 与使用$()this 包装到一个jQuery 对象中是一样的。本质上,如果this 与元素span.test 相同,那么$(this) 相当于在您正在查看的“索引”处获取$("span#test")(我松散地使用“索引”这个词)。

现在,这在性能方面意味着什么?这意味着每次您使用$(this) 时,您都会使用this 并从中创建一个对象。这样做通常会比最初找到$(this) 并将其设置为变量(例如$this)花费更多的开销。 然而,(它来了!)在你的情况下,你只使用一次$(this),每次你声明它。由于程序无论如何都必须生成一次$(this)(因为它必须找到它以将其设置为变量或立即使用),在您的情况下最好不要使用$this 而是跳过变量的创建和使用(这实际上会使您的情况更加昂贵),而是直接使用 $(this)

不过,通常情况下,您应该使用$this。为了理智起见,当我编码时,我一开始总是使用$this,并在我完成后删除它,如果需要的话。

【讨论】:

  • 你错了,this 是一个dom element$(this) 正在用一个 jQuery 对象包装那个 dom 元素,没有任何发现。
  • @DavidFregoli - 你是对的 - 它不是 finding,但它仍然是 creating,所以结果是一样的,但解释是有点偏离。我已经相应地更新了我的解释。
  • 哇,非常感谢您详细解释。
  • 没问题 - 这是开发人员在学习 jQuery 时应该始终学习的内容之一。那里有很多很好的资源,但没有一个初学者教程详细介绍它,并且开发人员通常不会考虑提高性能,直到他们开始推进过去的新手主题。你以这种方式学习它真是太好了! :)
  • 我想指出$this 无论如何都不是关键字(即使是$ 部分),它只是一个约定。你可以给它任何其他变量名。使用美元符号开始指向 jQuery 对象的变量名也是一个惯例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-28
  • 2020-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多