javascript - 调用 JavaScript 方法的正确方法

标签 javascript methods

<分区>

为什么我应该按如下方式调用 JavaScript 方法?

onClick="Javascript:MyMethod();"

或者我可以这样调用它:

onClick="MyMethod();"

有什么区别吗?

最佳答案

onclick 属性的值是代码,而不是 URI,所以这是正确的(虽然不是唯一的方法,请参见下面的切线 #1):

onClick="MyMethod();"

这是不正确但基本上无害:

onClick="Javascript:MyMethod();"

有时人们认为后者正在使用 javascript 协议(protocol),就像在链接上一样,但事实并非如此。它完全在做其他事情。 onclick 属性中的代码语言是在页面级别定义的(默认为 JavaScript),因此您实际做的是在 JavaScript 中声明一个标签代码,然后调用 MyMethod。 JavaScript 有标签(见下面的切线 #2),尽管它们用得不多。

onclick 属性与链接上的 href 属性完全不同:

<a href="javascript:MyMethod();">

在那里,由于我们将代码放在需要 URI 的位置,我们必须使用 javascript 协议(protocol)指定 URI,以便浏览器知道我们在做什么。 javascript 是一种协议(protocol)(如 httpmailto),Brendan Eich(JavaScript 的创建者)非常聪明地定义和注册(并实现)非常非常早,所以它得到了很好的支持。

最后:最好让 onclick 全部小写,而不是混合大小写,尽管只有在使用 XHTML 时才真正重要。


切线#1

也许有点离题,但是:使用 HTML 属性来连接处理程序是完全有效的,并且跨浏览器运行良好,但它会将 JavaScript 事件连接与 HTML 混合在一起。有些人认为这是一件好事,其他人则属于“不显眼的 JavaScript”方面,认为您应该稍后将所有内容连接起来。你做什么取决于你。当您的 HTML 设计人员和 JavaScript 编码人员不是同一个人时(这种情况在大型团队中经常发生),这种不显眼的方法特别有用。

不显眼的方法基本上是说:不要为此使用 HTML 属性,稍后从脚本中使用。所以不是

<ul id='tabset'>
    <li onclick="setTab(1);">Tab 1</li>
    <li onclick="setTab(2);">Tab 2</li>
    <li onclick="setTab(3);">Tab 3</li>
</ul>

你可能有这样的 HTML:

<ul id='tabset'>
    <li>Tab 1</li>
    <li>Tab 2</li>
    <li>Tab 3</li>
</ul>

结合这个 JavaScript:

function hookUpTabs() {
    var tabset, tab;
    tabset = document.getElementById('tabset');
    for (tab = tabset.firstChild; tab; tab = tab.nextSibling) {
        if (tab.tagName == "LI") {
            tab.onclick = setTab; // Hooks up handler, but there are better ways
        }
    }
}

...其中 setTab 使用上下文来确定单击了哪个选项卡并采取相应的操作,并且在 DOM 准备就绪后立即调用 hookUpTabs。请注意,在我们设置点击处理程序的地方,我们将函数引用而不是字符串分配给选项卡 div 上的 onclick

我实际上不会在上面使用 onclick,我会通过 addEventListener(标准)/attachEvent(微软)功能。但我不想讨论标准与微软的问题。而且你也不会,如果你开始使用不引人注目的 JavaScript,请使用一个库来为你处理这些东西( jQueryPrototypeClosurewhatever )。


切线 #2

另一个有点离题的话题:那么,这些 JavaScript 标签是什么?规范中的详细信息一如既往,但这里有一个在循环中使用带有定向 break 语句的标签的示例:

var innerIndex, outerIndex;

// Label the beginning of the outer loop with the (creative) label "outerloop"
outerloop: for (outerIndex = 0; outerIndex < 10; ++outerIndex) {

    for (innerIndex = 0; innerIndex < 50; ++innerIndex) {

        if (innerIndex > 3) {
            break; // Non-directed break, breaks inner loop
        }

        if (innerIndex > 2 && outerIndex > 1) {
            // Directed break, telling the code that we want to break
            // out of the inner loop *and* the outer loop both.
            break outerloop;
        }

        display(outerIndex + ":" + innerIndex);
    }
}

Live Example

关于javascript - 调用 JavaScript 方法的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3761167/

相关文章:

javascript - 在Javascript中,在IE8中,事件中附加的对象方法保持 'window object',而不是对象本身在 'this'

C# - 为什么这个变量在通过方法后没有被改变

Python 方法访问器在每次访问时创建新对象?

javascript - 使用 Sequelize 的多对多关系的简单示例

javascript - 使用 anchor .attr href 作为计数器中数组的起点

javascript - 为 React Native Web 项目使用适当的转译器

java - 我的程序存在问题,涉及数组列表、缓冲读取器、方法以及对 Java 工作原理的总体遗忘

javascript - jquery在分层菜单中选择li元素

javascript - http 到 https - 使浏览器为 http URL 请求相应的 https URL,而不需要编辑所有页面并手动将所有 URL 更改为 https?

python - 在 Python 中使用大小