【问题标题】:How on earth do I change a global variable from within a function?我到底如何从函数中更改全局变量?
【发布时间】:2012-09-08 07:57:02
【问题描述】:

我花了 3 天时间试图解决这个简单的问题。我想要的只是让我的整个网站记住winversion 全局变量值并能够从函数中更改它。 (是的,我知道全局变量比 darthwader 更邪恶,但请这是我生命中唯一的好事)

我有一个带有 <iframe> 的 html 文件,当用户在其中点击时,我将不同的页面(来自我的域)加载到该 <iframe> 中。

这是我的 index.html(它在 <iframe> 周围有几个 div,但我很确定这无关紧要,因为其他一切都有效,而 javascript 仅适用于 <iframe>

 <script type="text/javascript" src='script.js'></script>
---------- ( some inner body html , not important)----------------

 <iframe id="myiframe" src="mainproblems.html" >

默认的 iFrame 页面有这个 html 代码

    <a href="#" onclick="setwinver('xp')";>I have  Windows XP </a>
    <a href="#" onclick="setwinver('win7')";> have Windows 7/Vista </a>

我的 script.js 是这个

 // This is supposed to be my global variable to hold windows version value
 var winversion ; 

    // This function (I officially hate it now) is supposed to change 
    // winversion variable based on what user clicked on the iFrame
    function setwinver(ver) 

{   
        //so now winversion should either have xp or win7 assigned
        winversion=ver; 
}

但稍后,在下一个 &lt;iframe&gt; 中,当我尝试在同一个 JavaScript 文件中读取 winversion 时,它显示未定义。当用户在第 1 页选择 windows 版本并在下一个 html 页面中单击链接以启动 msconfig 描述页面(在 &lt;iframe&gt; 中加载)时,会触发此 navigatenow() 函数。

    function navigatenow()
{

        if (winversion == "xp")
    {
         window.location.href=("msconfigxp.html");
    }
    else
    {
        window.location.href=("msconfig7.html");
    }
}

我试过了:

  • 使用/不使用var

  • 使用/不使用单引号,双引号(虽然我知道这没什么区别)。

  • 阅读了十几篇关于吊装的文章。

  • 使用 persistjs 几个小时。

  • 冥想和祈祷!

没有任何效果。该死的winversion 变量仍然像我存在的目的一样未定义。

我想要的只是让我的 html 文件记住用户选择的 windows 版本(不,我无法以编程方式检测 windows 版本,我询问用户版本的目的是不同的)。

任何帮助将不胜感激解决此问题,如果没有,请建议一个合适的悬崖,我可以从中跳下。

【问题讨论】:

  • 您检查控制台是否有错误?看起来您正试图在框架的上下文中调用 setwinver(),而该函数是在父窗口的上下文中定义的。
  • 谢谢。但是只有 1 个 javascript 文件,并且 winversion 和 setwinver() 函数都在同一个文件中:(
  • “请推荐一个合适的悬崖,我可以从那里跳下来。”哈哈!
  • @LePrinceDeDhump 伙计,你太担心技术问题了 :)
  • 嗯...不,我正在认真地尝试在未来 5 年内接管世界,而全球变量正在将我的胜利日推后:(

标签: javascript scope global-variables hoisting


【解决方案1】:

iframe 中的页面是一个单独的窗口,它不会继承索引页面的范围。您需要指定要转到父窗口并在那里使用脚本:

window.parent.setwinver('xp');

访问变量也是一样的:

if (window.parent.winversion == "xp")

这是一个工作示例:http://jsfiddle.net/ga62A/

索引页面加载此 iframe:http://jsfiddle.net/cMDvc/1/
然后你继续这个 igrame:http://jsfiddle.net/9qjaX/

【讨论】:

  • 谢谢先生,但我认为 JavaScript 之神听到您试图解决我的问题并做了一些事情使其无法正常工作。当我使用此方法时,它仍然显示未定义......仍然!!!跨度>
  • @LePrinceDeDhump:我做了一个例子。
【解决方案2】:

LePrince,当您更改页面时,JS 会丢弃所有更改内容的内存。 JavaScript 被读入页面,但您不能从最终用户的浏览器 回 JS 文件,因为那只是要求拥有您的生命,你的网站和你所有的钱都被盗了。

您对阅读的原始代码所做的所有更改都存储在内存中。该内存仅持续与页面持续时间一样长。 之后,它会再次重新加载页面,和以前一样。

如果您需要它做更多的事情,您可以从document.cookie 开始。 它是用来存储非常小的信息的,使用起来并不好玩,除非你编写工具来获取 cookie 和设置 cookie。

接下来是localStorage,它更有用也更新(但旧的IE不支持,所以Windows 7的XP用户无法使用)。但这仍然只适用于一个用户的数据,不会改变任何其他用户的任何内容。

如果您希望能够添加... ...例如 cmets 或星级,其他人可以看到帖子和评级以及上传的图像,那么您需要研究服务器端编程。 Ruby(/Rails)、PHP、Node.js 等。

【讨论】:

  • Aaaaaaaaah ..... 所以 PHP 或 cookie 是最佳答案.... 非常感谢!!!!!!!!!现在我至少可以将两根手指伸到 winversion 变量上,并与 cookie 和 php 交朋友....当我的木星人接管世界时,您是一颗宝石,将成为骑士!
  • thxxx.x...我按照您的 cookie 建议在 5 分钟内修复了它...现在可以使用。我只是使用 cookie 来存储数据 YAAAAAAAY
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多