【问题标题】:How can I optimize this simple script?如何优化这个简单的脚本?
【发布时间】:2011-10-19 02:30:45
【问题描述】:

其实我有这段HT​​ML代码

<form method=POST action=dosomething.php>
    <fieldset>
        <legend>My account</legend>
        <ul>
            <li>
                <label for=email>e-mail</label> 
                <span>
                    <?=$account->email?>
                    (<a name="change">change</a>)
                </span>
                <span name="ph">
                    <input id="email" name="email" placeholder="new email" type=email>
                    <br>
                    <button name="change_email">change</button> or <a name="cancel">undo</a>
                </span>
            </li>
            <li>
                <label for=foo>foo</label>  
                <span>
                    <?=$account->foo?>
                    (<a name="change">change</a>)
                </span>
                <span name="ph">
                    <input id="foo" name="foo" type=text>
                    <br>
                    <button name="change_foo">change</button> or <a name="cancel">undo</a>
                </span>
            </li>
        </ul>
    </fieldset>
</form>

&lt;li&gt; ... &lt;/li&gt; 部分我只重复了 2 次,但它们重复了很多次,你会注意到有一部分是相同的。


我使用这个 JavaScript 是为了实现一个非常简单的事情:显示/隐藏两个 &lt;span&gt;s。

window.onload = function () { 
/* email */
document.getElementsByName('change')[0].onclick = function () {
    this.parentNode.style.display = 'none'; 
    document.getElementsByName('ph')[0].style.display = 'block';
}
document.getElementsByName('cancel')[0].onclick = function () {
    this.parentNode.style.display = 'none';
    document.getElementsByName('change')[0].parentNode.style.display = 'block';
    document.getElementsByName('change')[0].parentNode.style.width = '100%';
}

/* social id */
document.getElementsByName('change')[1].onclick = function () {
    this.parentNode.style.display = 'none'; 
    document.getElementsByName('ph')[1].style.display = 'block';  
}
document.getElementsByName('cancel')[1].onclick = function () {
    this.parentNode.style.display = 'none';
    document.getElementsByName('change')[1].parentNode.style.display = 'block';
    document.getElementsByName('change')[1].parentNode.style.width = '100%';        
}

/* avatar */
document.getElementsByName('change')[2].onclick = function () {
    this.parentNode.style.display = 'none'; 
    document.getElementsByName('ph')[2].style.display = 'block';  
}
document.getElementsByName('cancel')[2].onclick = function () {
    this.parentNode.style.display = 'none';
    document.getElementsByName('change')[2].parentNode.style.display = 'block';
    document.getElementsByName('change')[2].parentNode.style.width = '100%';        
}

/* shout */
document.getElementsByName('change')[3].onclick = function () {
    this.parentNode.style.display = 'none'; 
    document.getElementsByName('ph')[3].style.display = 'block';  
}
document.getElementsByName('cancel')[3].onclick = function () {
    this.parentNode.style.display = 'none';
    document.getElementsByName('change')[3].parentNode.style.display = 'block';
    document.getElementsByName('change')[3].parentNode.style.width = '100%';        
}
}

这太长了……而且重复。 如您所见,唯一改变的部分是getElementsByName('change')[aNumber]

我的问题是: 如何消除冗余?

一个小提示:我希望看到 jQuery 解决方案,但我更喜欢使用纯 JS。

提前谢谢你!

【问题讨论】:

    标签: php javascript html optimization redundancy


    【解决方案1】:

    你当然可以用几个循环来简化事情:

    elements = document.getElementsByName('change');
    
    for (var i = 0; i < elements.length; i++) {
        elements[i].onclick = function() {
            document.getElementsByName('ph')[i].style.display = 'block';  
        }
    }
    
    cancels = documents.getElementsByName('cancel');
    
    for (i = 0; i < cancels.length; i++) {
        cancels[i].onclick = function () {
            this.parentNode.style.display = 'none';
            cancels[i].parentNode.style.display = 'block';
            cancels[i].parentNode.style.width = '100%';
        }
    }
    

    【讨论】:

    • 这不会给i 的作用域带来问题吗?
    • 是的,很遗憾。并不是一个灵丹妙药的答案,而是一个如何简化事情的例子。
    • 有谁知道一些技巧来解决范围界定问题?
    • 将 jquery 用于此类事情,并带有 .bind() 选项。
    • 我喜欢你的解决方案,但不幸的是对我不起作用:(document.getElementsByName('ph')[i].style.display = 'block';这不起作用
    【解决方案2】:

    给他们上同一门课。

    使用document.getElementsByClassName

    例如:

    var clickables = document.getElementsByClassName('clickme');
    for(var i = 0; i < clickables.length; i++){
         clickables[i].onclick = function(){
               //some click fn
         }
    }
    

    【讨论】:

    • 应该是getElementsByClassName,9之前的IE不支持。
    【解决方案3】:

    要在 JQuery 中执行此操作,您可以使用 .each(),但我认为您需要更改标记以使用 class 而不是 name,因为我不知道使用名称作为选择器。如果有办法,请告诉我!

    $('.change').each(function(){
       $(this).click(function(){
          // Click function for 'change'
       });
    });
    
    $('.cancel').each(function(){
       $(this).click(function(){
          // Click function for 'cancel'
       });
    });
    

    【讨论】:

    • 我不喜欢 jQuery,但最终我选择了这个解决方案。谢谢大家!
    • 感谢您选择我的解决方案,但是我能问一下您为什么不喜欢 JQuery,如果您不喜欢它,您为什么选择它?只是好奇而已!
    • 我一般不喜欢框架,因为对于学习目的来说是邪恶的,但这次我决定改变规则。就是这样:)
    • 很公平,尽管使用诸如 jquery 之类的框架并不一定意味着您可以在不知道 javascript 工作原理的情况下逃脱。最好了解 jquery 的工作原理和方式,以便调试您的代码。
    猜你喜欢
    • 2023-03-27
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多