Javascript document.getElementById()!=null不适用于firefox

Javascript document.getElementById()!=null不适用于firefox,javascript,jquery,html,firefox,razor,Javascript,Jquery,Html,Firefox,Razor,我的Razor视图中有以下脚本:- if (document.getElementById("currentdate") != null && document.getElementById("currenttime") != null) { document.getElementById("currentdate").innerHTML = EMBEDformatAMPM(); 我现在做的是:- 因为currentdate和currenttime仅在用户经过身

我的Razor视图中有以下脚本:-

if (document.getElementById("currentdate") != null && document.getElementById("currenttime") != null) {
        document.getElementById("currentdate").innerHTML = EMBEDformatAMPM();
我现在做的是:-

因为currentdate和currenttime仅在用户经过身份验证时显示。因此,如果元素未显示,getElementById.innerHTML将引发引用异常。因此,我决定在设置它们的.innerHTML之前检查这些元素是否存在。 我的检查在IE和chrome上运行良好,而在firefox上,即使currentdate和currenttime DOM元素存在,也不会显示当前日期和时间 。。有人能给我一些建议吗

编辑 以下是生成的HTML:-

<section id="login" class="navbar-search pull-right">
  <span class="username customTopNavText " style=" display:block; ">
      [<a href="/tms/Account/LogOff/" style="color:white"> Logout </a>]
      <i class="icon-user"></i> <strong >   </strong>
  </span>
  <div  class="customTopNavText" id="currentdate"></div>
  <div  class="customTopNavText" id="currenttime" ></div>   
      <form class="customSearch"method="GET" action="/tms/Home/Search">
          <input  class="push-up-button searchmargin" placeholder="Search by tag.." name="searchTerm2" data-autocomplete-source= "/tms/Home/AutoComplete" type="text" style="margin-top:8px"/><input type="submit" value="Search" class="btn" />
      </form>
</section>

<div class="top-nav nav-collapse">
    <ul class="nav">
        <li class="customTitle" style= "color:#f99406">TMS - Staging  </li>
        <li></li>
    </ul>
</div><!--/.nav-collapse -->

</div>
</div>

</div>

谢谢

Firefox通常会被块中的函数声明阻塞。。。您可以自己尝试一个简单的示例:

if (true) {
    execute();
    function execute() { alert("worked"); } 
}
上述内容在Chrome和IE中有效,但在FF中无效,尽管存在错误。如果出现以下情况,请尝试将EMBEDformatAMPM声明置于您的外部:

function EMBEDformatAMPM() {
    var d = new Date(),
        minutes = d.getMinutes().toString().length == 1 ? '0' + d.getMinutes() : d.getMinutes(),
        hours = d.getHours().toString().length == 1 ? '0' + d.getHours() : d.getHours(),
        ampm = d.getHours() >= 12 ? 'pm' : 'am',
        months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
        days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
    return days[d.getDay()] + ' ' + d.getDate() + ' ' + months[d.getMonth()] + ' ' + d.getFullYear();
}

var el = document.getElementById('currentdate'); 
if (el != null) {       
        el.innerHTML = EMBEDformatAMPM();
}
我说FF阻塞可能有点不公平——根据规范,块中唯一允许的是语句,函数声明不是语句

您可能还想继续,因为您的代码中有一些地方需要改进

编辑回复评论 这不是Firefox的bug,因为根据规范,您所做的技术上是不允许的。Chrome和IE对你想要的东西做了一个很好的猜测,这使得它们更加宽容,但不能保证它们在未来的版本中会起作用

关于代码的改进,请查看以下内容


您需要提供更多的信息,最好是一个完整的例子来重现FF中的问题。如果您使用jQuery,您可以通过执行$currentdate.Length来检查它是否存在。使用getElementById两次来获取相同的元素太过分了。最好只使用一次,并将返回值保存在变量中。此外,由于getElementById只返回对象,您可以跳过与null的比较,只让它强制为布尔值;如果el!=null{el.innerHTML=EMBEDformatAMPM;}检查元素是否存在的方式也很好。getElementById要么返回元素对象,要么返回null。我理解这个问题,我无法想象像if语句这样简单的东西在FF中的工作方式与在Chrome中的工作方式不同。因此,我相信问题是在别的地方。是的,它工作得很好,所以我能把我的问题看作是FF中的一个bug吗?或者我不应该在If语句中有这样的函数?如果你能提到我可以在代码中改进哪些方面?我将在大约30分钟后更新,但这不是ff中的bug。
function EMBEDformatAMPM() {
    var d = new Date(),
        minutes = d.getMinutes().toString().length == 1 ? '0' + d.getMinutes() : d.getMinutes(),
        hours = d.getHours().toString().length == 1 ? '0' + d.getHours() : d.getHours(),
        ampm = d.getHours() >= 12 ? 'pm' : 'am',
        months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
        days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
    return days[d.getDay()] + ' ' + d.getDate() + ' ' + months[d.getMonth()] + ' ' + d.getFullYear();
}

var el = document.getElementById('currentdate'); 
if (el != null) {       
        el.innerHTML = EMBEDformatAMPM();
}
// wrap in IIFE to avoid polluting global namespace.
(function () {
   // declare all our variables at the top of the function
    var currentDate = document.getElementById('currentdate'),
       currentTime = document.getElementById('currenttime'),
       updateTime,
       getFormattedDate,
       getFormattedTime;

    // Give functions names that make their purpose clear
    getFormattedDate = function() {
            var d = new Date(),
                months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
                days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
            return days[d.getDay()] + ' ' + d.getDate() + ' ' + months[d.getMonth()] + ' ' + d.getFullYear();       
    };
    getFormattedTime = function () {
            var d = new Date(),
                minutes = d.getMinutes().toString().length == 1 ? '0' + d.getMinutes() : d.getMinutes(),
                hours = d.getHours().toString().length == 1 ? '0' + d.getHours() : d.getHours();
            return hours + ':' + minutes;
    };

    // This function updates the time and then 
    // sets a timeout to execute again after 3 seconds.
    updateTime = function () {
        if (currentTime !== null && currentDate !== null) {
            currentTime.innerHTML = getFormattedTime();
            currentDate.innerHTML = getFormattedDate();
        }
        window.setTimeout(updateTime, 3000);
    };
    // Start it off.
    updateTime();
}());