Javascript document.getElementById()!=null不适用于firefox
我的Razor视图中有以下脚本:-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仅在用户经过身
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();
}());