JavaScript在HTML5中无法工作

4
我开始在我的项目中实现一些新的HTML5功能(标准,没有花哨的东西),比如标准的header、footer、aside等。但由于某些原因,我之前用过的JavaScript代码现在无法工作,我无法找出问题所在。
我将代码(HTML/JavaScript)与我的新项目和之前的项目(其中JavaScript可以工作)进行了比较,但我没有看到任何区别。我唯一能想到的是HTML版本的变化。
顺便说一下,我正在尝试实现一个脚本,它可以突出显示菜单中当前链接。它应该使用JavaScript来添加/删除菜单中锚点标签上的“.selected”代码,并与当前页面和链接相关联。
以下是代码:
<aside>
        <section>
            <Strong>Quick Links</strong>
                <menu id="side_menu">
                    <ul>
                        <li><a href="application.php">Sign Up</a></li>
                        <li><a href="testimonials.php">Testimonials</a></li>
                        <li><a href="diploma.php">The Process</a></li>
                        <li><a href="diploma.php">Course Listings</a></li>
                        <li><a href="about.php">American High School</a></li>
                     </ul>
                </menu> 

        <script>
            $(document).ready(function() {
                var loc = window.location.href; // The URL of the page we're looking at
                $('#side_menu a').each(function() {
                    if (loc.indexOf(this.href) !== -1) { // If the URL contains the href of the anchor
                            $(this).addClass('selected'); // Mark it as selected
                    }
                });
            });
        </script>

        </section>
</aside> 

这是该网站的链接:这里(侧边栏)。我需要关于这个问题的任何帮助,因为我已经花了几个小时来解决它。谢谢你的帮助。

你是否同时使用Prototype和jQuery?或者其他的js框架?我曾在客户购买的“即插即用”软件包上遇到过这个问题,我不得不为jQuery设置noConflict。这也可能是你的情况。 - Kyle
1个回答

3
一个问题是您正在尝试在包含Prototype之前使用它。请将js/prototype.js的脚本标签移动到js/drop-o-matic.js的脚本标签之前。
如果您使用调试器(Chrome的开发工具,Firefox的Firebug,IE的Script Debugger等),它应该会告诉您原因。在这种情况下,例如,Chrome的Dev Tools向我显示了Uncaught TypeError: Object #<an HTMLDocument> has no method 'observe',这立即指向了正确的方向-您的DOM加载函数未运行,因为您正在尝试在Prototype添加document.observe之前将其连接起来。
修复以上问题后,控制台显示Uncaught TypeError: Object #<an HTMLDocument> has no method 'ready'。那是因为您尝试使用jQuery代码而没有包含jQuery:
$(document).ready(function() {
    var loc = window.location.href; // The URL of the page we're looking at
    $('aside li a').each(function() {
        if (loc.indexOf(this.href) !== -1) { // If the URL contains the href of the anchor
            $(this).addClass('selected'); // Mark it as selected
        }
    });
});

如果您愿意,您可以使用jQuery和Prototype技术。但是,如果只是为了这个代码片段,我建议将其转换为Prototype代码:

document.observe("dom:loaded", function() {
    var loc = window.location.href; // The URL of the page we're looking at
    $$('aside li a').each(function(link) {
        if (loc.indexOf(link.href) !== -1) { // If the URL contains the href of the anchor
            link.addClassName('selected'); // Mark it as selected
        }
    });
});

如果你在其他地方使用了jQuery代码,你需要包含jQuery并使用jQuery.noConflict(可以点击jQuery.noConflict查看)。这将允许Prototype保留$符号(需要使用jQuery代替$来调用jQuery函数,或者使用jQuery的load函数作为作用域函数)。

谢谢您的快速回应!有趣的是,我按照您所说的做了,它竟然解决了我另一个JS问题,但是侧边栏菜单仍然无法正常高亮显示。您认为这可能是我在JS中使用的参考引用吗?我先采用了“#side_menu a”,然后我尝试了“aside li a”,但它没有起作用...您知道问题可能是什么吗? - gdinari
@gdinari:在我看来,你似乎正在尝试在一个使用Prototype而没有包含jQuery的页面/站点上使用jQuery代码。我更新了我的答案。 - T.J. Crowder
好的,我尝试将prototype.js转换成你提供的代码,但没有效果。我猜我得使用JQuery.noConflict与我的原始代码一起使用吗?我不是完全确定,因为JavaScript/jQuery对我来说很陌生。我会认真阅读你的建议并尝试让它工作。如果你有其他建议,请告诉我。非常感谢你的帮助。 - gdinari
@gdinari:我的jQuery -> Prototype翻译中有一个错误(我应该使用addClassName而不是addClass)。现在翻译已经可以使用了。我不知道它是否完全符合您的要求,但它似乎基本上可以工作:http://jsbin.com/uriyi3/4 在这个例子中,有四个链接,其中两个链接指向同一页(一个绝对路径,一个相对路径)。如果它们与页面位置匹配,它们应该会变成灰色背景。对我来说,它们确实是这样的。祝你好运。 - T.J. Crowder
非常感谢!我查看了一些以前关于我的其他问题的答案,但是无法将逻辑应用到这种情况。但是您提供的链接中的示例帮了很大的忙。我需要大量阅读有关js的资料。再次感谢。 - gdinari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接