jQuery 在焦点/模糊上切换同级

发布于 2024-10-21 00:32:37 字数 1068 浏览 1 评论 0原文

所以我现在有了这个并且它可以工作,但我想知道在我编写移动网站时是否有最佳的编写方式,以及性能是否是一件大事。

想想在元素下滑动(切换)的工具提示,我在页面上还有大约 30 个工具提示 div,因为这将用于多个元素

JS:

$('.mobile-tool-tip').each(function() { 
    $(this).hide();                         
    $(this).prev().focus(function() {
        $(this).next().slideToggle('fast');
    });
    $(this).prev().blur(function() {                    
        $(this).next().slideToggle('fast');
    });
});

移动工具提示功能的 HTML

<div data-role="fieldcontain">
    <input type="text" name="telephone" id="telephone" placeholder="Phone Number*" />
    <div class="mobile-tool-tip" id="telephone_tip">Valid format <strong>999-999-9999</strong>. Please include the area code.</div>
</div>

一直在使用这个(感谢 Hunter) 来切换元素,但无法让它与 next() 一起使用,而且我不想对每个工具提示 div 进行编码手工

$("[name=field_name]").change(function() {
    var show = $(this).val();
    $("#hidden_div").toggle(show);
});

So I have this now and it works, but I wanted to know if there is an optimal way of writing this as I writing a mobile site and performance if a big thing.

Think tool-tip that slides down (toggles) under the element, I also have about 30 tool tip divs on the page as this will be for multiple elements

JS:

$('.mobile-tool-tip').each(function() { 
    $(this).hide();                         
    $(this).prev().focus(function() {
        $(this).next().slideToggle('fast');
    });
    $(this).prev().blur(function() {                    
        $(this).next().slideToggle('fast');
    });
});

HTML for mobile-tool-tip function

<div data-role="fieldcontain">
    <input type="text" name="telephone" id="telephone" placeholder="Phone Number*" />
    <div class="mobile-tool-tip" id="telephone_tip">Valid format <strong>999-999-9999</strong>. Please include the area code.</div>
</div>

Have been using this (Thanks Hunter) to toggle elements but cant get it to work with the next() and I don't want to code each tool tip div by hand

$("[name=field_name]").change(function() {
    var show = $(this).val();
    $("#hidden_div").toggle(show);
});

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

江湖正好 2024-10-28 00:32:37

一些建议:

  • 使用 CSS 隐藏 .mobile-tool-tip 元素可以节省几毫秒的时间。
  • 将事件附加到父 div。查找父元素比查找兄弟元素更快。
  • 当您查找 nextprev 元素并且它是特定元素时,我始终建议使用 `nextAll(".mobile-tool-tip")
  • You'查找 $(this).prev() 非常耗时。不要做两次。 jQuery 中的许多函数都会返回对最后一次查询的引用,这使您能够链接调用(类似于 $(".anElement").hide().remove())。利用它来节省时间。
  • 当您有一个聚焦操作和其他模糊操作时,请使用确定性方法来隐藏/显示或启用/禁用元素。这将确保您不会错过任何活动或特殊场合,并防止出现任何与之相关的错误。

所以:

$('.mobile-tool-tip').each(function() { 
    $(this).prev().focus(function() {
        $(this).nextAll(".mobile-tool-tip").slideDown('fast');
    }).blur(function() {                    
        $(this).nextAll(".mobile-tool-tip").slideUp('fast');
    });

});

祝你好运!

A few suggestions:

  • Save a few milliseconds hiding .mobile-tool-tip elements with CSS.
  • Attach the event to the parent div. It's faster to find the parent element than find a siblings.
  • When you're looking for next or prev elements, and it's an specific element, I always suggest to use `nextAll(".mobile-tool-tip")
  • You're consuming time finding $(this).prev(). Don't do it twice. A lot of functions in jQuery returns a reference to the last query made, this is what enables you to chain calls (something like $(".anElement").hide().remove()). Make use of it to save time.
  • When you have an action to focus and other to blur, use an deterministic method to hide/show or enable/disable elements. This'll ensure that you didn't miss any event or special occasion, and will prevent for any bug related to it.

So:

$('.mobile-tool-tip').each(function() { 
    $(this).prev().focus(function() {
        $(this).nextAll(".mobile-tool-tip").slideDown('fast');
    }).blur(function() {                    
        $(this).nextAll(".mobile-tool-tip").slideUp('fast');
    });

});

Good luck!

樱娆 2024-10-28 00:32:37

一些简单的想法。

  1. 您可以缓存选择器并将调用链接在一起,以避免 dom 上的任何迭代。
  2. 您还可以在焦点和模糊函数中创建提示的闭包,这将不会导致额外的 dom 迭代。

所以你最终可能会得到这样的结果...

$('.mobile-tool-tip').each(function() {
    var $tip = $(this);
    $tip.hide().prev().focus(function() {
        $tip.slideToggle('fast');
    }).blur(function() {                    
        $tip.slideToggle('fast');
    });
});

jsfiddle 在触发时显示出轻微的性能增益带有关闭的事件。

Some simple thoughts.

  1. You can cache your selector and chain your calls together to avoid any iteration over the dom.
  2. You could also create a closure of your tip in your focus and blur functions which will result in no additional dom iteration.

So you might end up with something like this...

$('.mobile-tool-tip').each(function() {
    var $tip = $(this);
    $tip.hide().prev().focus(function() {
        $tip.slideToggle('fast');
    }).blur(function() {                    
        $tip.slideToggle('fast');
    });
});

jsfiddle that shows a slight performance gain when triggering the event with a closure.

不语却知心 2024-10-28 00:32:37

您可以尝试使用变量来保存 $(this).next() 元素,从而组合对 DOM 的一些调用。根据文件的大小,这可以节省大量时间,而不必进行两次调用。

var nextElement = $(this).next();
$(this).prev().blur(function(){
$(nextElement).slideToggle();
}

You can try to combine some of the calls to the DOM by using a variable to hold the $(this).next() element. Depending on how big the file is, this can cut a substantial amount of time not having to make that call twice.

var nextElement = $(this).next();
$(this).prev().blur(function(){
$(nextElement).slideToggle();
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文