是否可以在JavaScript函数中定义全局变量?
我想在其他函数中使用trailimage变量(在makeObj函数中声明).
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<title></title>
<script type="text/javascript">
var offsetfrommouse = [10, -20];
var displayduration = 0;
var obj_selected = 0;
function makeObj(address) {
**var trailimage = [address, 50, 50];**
document.write('<img id="trailimageid" src="' + trailimage[0] + '" border="0" style=" position: absolute; visibility:visible; left: 0px; top: 0px; width: ' + trailimage[1] + 'px; height: ' + trailimage[2] + 'px">');
obj_selected = 1;
}
function truebody() {
return (!window.opera && document.compatMode && document.compatMode != "BackCompat") ? …Run Code Online (Sandbox Code Playgroud) 通常我会有一个我想要使用的JavaScript文件,需要在我的网页中定义某些变量.
所以代码是这样的:
<script type="text/javascript" src="file.js"></script>
<script type="text/javascript">
var obj1 = "somevalue";
</script>
Run Code Online (Sandbox Code Playgroud)
但我想做的是:
<script type="text/javascript"
src="file.js?obj1=somevalue&obj2=someothervalue"></script>
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的方法,最好的方法是解析查询字符串,如下所示:
var scriptSrc = document.getElementById("myscript").src.toLowerCase();
Run Code Online (Sandbox Code Playgroud)
然后搜索我的价值观.
我想知道是否有另一种方法可以做到这一点,而无需构建一个解析我的字符串的函数.
你们都知道其他方法吗?
我正在阅读一些代码,并在脚本的开头我们有var emailID = email.稍后,代码通过go引用emailID window.emailID.我想知道什么是允许你通过window.variableName引用变量的规则?
我无法在线发布我的脚本,因为它与我的工作直接相关,会违反我的合同.
(在评论之后创建一个单独的问题:Javascript重新声明的全局变量覆盖旧值)
我正在使用方括号表示法创建一个全局范围的变量,并在外部js文件中为其赋值.
在另一个js文件中,我声明了一个与我刚才创建的var同名的var.注意我没有分配值.由于这是对同一变量的重新声明,因此不应覆盖旧值,如下所述:http://www.w3schools.com/js/js_variables.asp
使用以下内容创建2个javascript文件:Script1
//create global variable with square bracket notation
window['y'] = 'old';
Run Code Online (Sandbox Code Playgroud)
SCRIPT2
//redeclaration of the same variable
var y;
if (!y) y = 'new';
alert(y); //shows New instead of Old in IE
Run Code Online (Sandbox Code Playgroud)
在您的html文件中包含这两个文件
<html>
<head></head>
<body>
<script type="text/javascript" src="my.js"></script>
<script type="text/javascript" src="my2.js"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
在Firefox和Chrome中打开此页面警告"旧"这是预期的行为.但是在IE 8中,该页面实际上会提醒"新"
有关为何在IE上发生这种情况的任何想法
javascript internet-explorer scope global-variables internet-explorer-8
我想根据我在angularjs bootstrap中定义的预设常量来更改与控制器关联的templateUrl.我无法弄清楚如何改变它.我已经尝试过UrlRouteProvider但是还没弄清楚如何从文件系统中拉出html.我被困在templateUrl上.
在下面的代码中,输出首先显示"svcc确实传递到第一个函数的console.out但是在templateUrl定义函数中,CONFIG是未定义的.
我愿意采取其他方式来做到这一点.
var app = angular.module('svccApp', [
'ui.router'
]);
var myConstant = {};
myConstant.codeCampType = "svcc";
app.constant("CONFIG", myConstant);
app.config(['$stateProvider', '$urlRouterProvider','CONFIG',
function ($stateProvider, $urlRouterProvider,CONFIG) {
console.log(CONFIG.codeCampType);
$stateProvider
.state('home', {
url: '/home',
//templateUrl: 'index5templateA.html', (THIS WORKS)
templateUrl: function(CONFIG) {
console.log('in templateUrl ' + CONFIG.codeCampType);
if (CONFIG.codeCampType === "svcc") {
return 'index5templateA.html';
} else {
return 'index5templateB.html';
}
},
controller: function ($state) {
}
});
}]);
Run Code Online (Sandbox Code Playgroud) 以下是我的javascript函数,我想使用变量选择 外部函数,但我在inspect元素的控制台中选择了未定义的错误.window.yourGlobalVariable并没有解决我的问题.
function showMe(pause_btn) {
var selected = [];
for (var i = 0; i < chboxs.length; i++) {
if (chboxs[i].checked) {
selected.push(chboxs[i].value);
}
}
}
Run Code Online (Sandbox Code Playgroud) 我注意到,在我的团队升级到Dojo 1.8之后,我正在为项目工作的一些遗留脚本不再工作了.具体来说,他们创建的全局变量不再被创建.
我挖了一遍,发现Dojo 1.8团队非常反对全局变量.事实上,如此反对,他们认为用户在物理上不可能在需要的末尾使用以下代码在必需的脚本中创建全局变量:
req.eval =
function(text, hint){
return eval_(text + "\r\n////@ sourceURL=" + hint);
};
var eval_ = new Function('return eval(arguments[0]);');
Run Code Online (Sandbox Code Playgroud)
这很好,但是我正在使用的旧代码无法更改,所以我一直在试图弄清楚如何解决这个问题并在本地环境中执行eval.
幸运的dojo.eval是,Dojo的旧版本仍然存在,这就是我想要的.所以我只需要访问req.eval并更改要执行的功能,return dojo.eval(...)甚至只是eval(...)在某些情况下.
问题是,我无法弄清楚如何获得访问权限req.这是发生的事情:
我dojo.js在HTML文件的顶部包含脚本标记.它加载在自己的脚本文件中.
dojo.require可以从我自己的文件访问.它define在脚本文件中定义:
'dojo/_base/loader':function(){
define(["./kernel", "../has", "require", "module", "./json", "./lang", "./array"], function(dojo, has, require, thisModule, json, lang, array) {
Run Code Online (Sandbox Code Playgroud)
我不确定这是否重要.无论如何,在范围内dojo.require,我可以看到一些叫做的东西injectModule,而在我自己的文件中我却做不到. injectModule是一个局部变量,所以你无法看到它this.它在文件开头的匿名函数中定义,即
(function(){ ... injectModule = function(){} ... })();
Run Code Online (Sandbox Code Playgroud)
在injectModule函数内部,有以下行:
req.getText(url, legacyMode!=sync, …
我有以下脚本:
xxx = 12232;
for (var j in window) {
if (j==='xxx') alert('hey');
}
Run Code Online (Sandbox Code Playgroud)
如果我在Chrome或Firefox中执行,我会打开警告对话框'嘿'.
如果我在IE8中执行,我不会.
显然,这是一段代码来证明我无法从IE8中的窗口访问变量.
有人可以解释为什么会这样吗?
这可能是一个非常快速的答案(或一个非常愚蠢的问题),但我正在尝试存储一个整数数组,以便随后可以通过另一个函数在本地访问它们.
到目前为止我想到的方法(及其缺点):
data-ids="1,2,3"(不能在这些中轻松存储数组)localStorage(只能存储字符串,而不是数组,必须转换)<input type="hidden">(再次,不能存储数组,必须转换为字符串)理想情况下,我希望能够使用语法array.push(value)等将值推送到此本地存储的数组上.
是否有一种简单的方法可以做到这一点,我缺少或将采取黑客攻击?此数组的最终用法将与另一个整数数组进行比较,以查看是否有任何值匹配,如果匹配,则从第二个数组中删除索引(即它是一个数组过滤器).
此数组不应存储在服务器上,因为它对于客户端的每个用户都不同.如果没有好的方法可以做到这一点,我可能会考虑以不同的方式实现功能.
我有以下功能(在IE6中工作,但在IE8中被破坏)
function implode() { var str = '';
for(item in globvars) //<- IE8 wets itself here ...
str+= '\n' + globvars[item]+';';
return str+'\n';
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一个无害的小功能,但IE8非常小心.任何人都可以告诉我如何重写它,以便它在IE8(以及其他浏览器)中工作?
[编辑]
在脚本的开头(即标记之后的第一行,我已经定义了像这样的globvars:
var globvars = new Array(); // This should give globvars global scope
Run Code Online (Sandbox Code Playgroud)
IE8的错误是:
对象不支持此操作
javascript ×9
scope ×3
angularjs ×1
arrays ×1
declaration ×1
dojo ×1
function ×1
json ×1
variables ×1