【问题标题】:Simple statement written with jQuery, How would I write this with PrototypeJS用 jQuery 编写的简单语句,我将如何用 PrototypeJS 编写此语句
【发布时间】:2009-07-13 13:25:51
【问题描述】:

用 jQuery 写的语句,我应该怎么用原型写这个

$("#productNav li a").click(function(){
$("#productNav li a").removeClass("selectedProd");
$(this).addClass("selectedProd");
$("#productListCntnr > ul").slideUp(300);
$("#productListCntnr > ul."+this.id).slideDown(300);
});

【问题讨论】:

    标签: javascript jquery prototypejs


    【解决方案1】:

    我不确定处理您正在执行的滑动操作的最佳方法,但这应该可以完成单击和添加/删除 selectedProd CSS 类的基本机制。

    Event.observe(window, 'load', function() {
        //When the window loads, iterate over all of the appropriate <a> tags
        $$('#productNav li a').each( function(elem) {
    
            //Handle the click event on each a tag
            Event.observe(elem, 'click', function(event) {
                //Remove the selectedProd class from all <a> tags
                $$('#productNav li a').each( function(elem) {
                    elem.removeClassName('selectedProd');
                });
    
                //Add the selectedProd class to the <a> tag that was clicked
                this.addClassName('selectedProd');
    
                //Stop the browser from following the link specified in the href=""
                Event.stop(event);
            });
        });
    });
    

    【讨论】:

    • 您可以通过跟踪先前选择的“a”标签来缩短这一点,而不是在每次点击时循环遍历所有标签。但我会把它作为练习留给你:)
    【解决方案2】:

    虽然我在想这个马克已经回答了,但我想出了以下内容:

    $$("#productNav li a").observe('click', function(event){
      $$("#productNav li a").invoke('removeClassName', 'selectedProd'));
      $$("#productListCntnr > ul").invoke('SlideUp',{ duration: 3.0 });
      Event.element(event).invoke('addClassName', 'selectedProd'));
      $$("#productListCntnr > ul#"+Event.element(event).id).invoke('SlideDown',{ duration: 3.0 });
    });
    

    SlideUp 和 SlideDown 方法来自 Scriptaculous,不确定它们是否直接兼容 jQuery 效果。我还假设您在最后一行中的意思是 ul#,因为您是按 ID 选择的,在这种情况下,由于 ID 无论如何都是唯一的,您可以这样做:

    Effect.SlideDown(Event.element(event).id, { duration: 3.0 });
    

    --编辑

    根据 Mark 的评论,我在实际浏览器中使用了上述代码,这是一个工作版本:

    Event.observe(window, 'load', function() {
        $$("#productNav li a").invoke('observe', 'click', function(event){
            $$("#productNav li a.selectedProd").invoke('removeClassName', 'selectedProd');
            Event.element(event).addClassName('selectedProd');
            Effect.Pulsate(Event.element(event).id, { pulses: 5, duration: 3.0 });
        });
    });
    

    我不确定 SlideUp 应该做什么,所以我把它拿出来了,我认为它与 productNav 中的列表元素不同? SlideDown 似乎也没有做任何事情,可能是因为 SlideUp 不见了,所以我把它换成 Pulsate 只是为了确认它正在工作。我不得不使用上面提到的替代语法,因为原始语法根本不起作用(出现错误,例如元素上不存在调用方法)。

    我猜原始代码是打算将 SlideUp 和 SlideDown 与菜单项分开的内容区域?在这种情况下,此代码必须更改,但您的原始 html 也将无效,因为它暗示菜单中的列表项和内容区域中的列表项具有相同的 id。作为参考,这是我的 HTML 的样子:

    <ul id="productNav">
        <li><a id="p1" href="#">Product 1</a></li>
        <li><a id="p2" href="#">Product 2</a></li>
        <li><a id="p3" href="#">Product 3</a></li>
        <li><a id="p4" href="#">Product 4</a></li>
        <li><a id="p5" href="#">Product 5</a></li>
        <li><a id="p6" href="#">Product 6</a></li>
    </ul>
    

    【讨论】:

    • 我认为你不能将 $$() 与 .observe() 一起使用
    • 或者 .invoke() 因为 $$() 只是返回一个扩展元素数组。
    • 啊,是的。 Invoke 没问题 - 它在数组的每个元素上调用函数(请参阅prototypejs.org/api/enumerable/invoke - 它在 Enumerable 对象上),但是是的,我希望观察本身需要包含在类似调用的东西中() 或每个()
    • 非常感谢,非常感谢您的回答
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 2015-06-09
    • 1970-01-01
    相关资源
    最近更新 更多