无法在onchange = function()中为另一个字符串分配字符串

时间:2016-01-07 15:31:26

标签: javascript variables variable-assignment onchange jquery-selectbox

我有这个:

<select id="prio" class="w60">
    <option value="1">1</option>
    <option value="2">2</option>
    <option value="3">3</option>
</select>

如果我选择其他值,则会调用onchange = function()

var prio = document.getElementById('prio');
var string1 = "Hello";
var string2 = "";

    prio.onchange = function () 
    {
        prioIndex = prio.options[prio.selectedIndex].text;
        switch (prioIndex) 
        {
           case '1': prioIndex = " my Friend";
                     break;
           case '2': prioIndex = " my Sister and Brother";
                     break;
           case '3': prioIndex = " my Mom and Dad";
                     break;
         }
       alert(prioIndex);
       string2 = prioIndex;
     }


alert(string2);

函数内的警报工作正常,但他不会分配新的String。

alert(string2)显示string2(未定义)。

我想在函数外部使用string2。但我不能,因为它永远不会被分配。但我不知道为什么。

让我们说,我想在另一个onchange函数中使用string2 ...

var string3;
news.onchange = function () 
{ 
   string3 = string2.concat(' how are you');
   alert(string3);
}

并将其分配给string3。如果我想在onc​​hange-function之外使用string3,那就是undefined

2 个答案:

答案 0 :(得分:1)

这是因为alert(string2)不在点击处理程序中,只会执行一次无关紧要prio被点击。尝试将其移入内部以检查每次点击时string2的值。

prio.onchange = function () 
    {
        prioIndex = prio.options[prio.selectedIndex].text;
        switch (prioIndex) 
        {
           case '1': prioIndex = " my Friend";
                     break;
           case '2': prioIndex = " my Sister and Brother";
                     break;
           case '3': prioIndex = " my Mom and Dad";
                     break;
         }
       alert(prioIndex);
       string2 = prioIndex;
       alert(string2);
     }

答案 1 :(得分:0)

JavaScript有我们称之为'回调'的东西。回调是在设置回调的元素上发生操作后执行的函数。因此,只有当您更改HTML页面上的onchange元素时,才会执行prio功能。

这意味着您的prio.onchange = function () { ... }将无法执行,除非您转到HTML页面,点击您的选择元素并更改其值。

因此,一旦该代码加载到您的浏览器中将会执行以下操作(它不完全正确但会帮助您理解为什么string2未按预期分配) :

var prio = document.getElementById('prio');
var string1 = "Hello";
var string2 = "";
alert(string2);

你能看到问题吗?对!!!调用string2时,alert(string2)为空! :d

您可以通过将string2传递给回调中的其他功能来执行您想要的操作,例如:

var foo = function ( val ) {
  alert('string2 value is: ' + val);
};

prio.onchange = function () {
  prioIndex = prio.options[prio.selectedIndex].text;

  switch (prioIndex) {
    case '1': prioIndex = " my Friend";
              break;
    case '2': prioIndex = " my Sister and Brother";
              break;
    case '3': prioIndex = " my Mom and Dad";
              break;
  }

  foo(prioIndex);
}

但是,如果要在两个不同的回调中使用该信息,可以定义一个函数,以便在需要时获取该值。我的意思是:

var string2 = function () {
  var prio = document.getElementById('prio');
  prioIndex = prio.options[prio.selectedIndex].text;

  switch (prioIndex) {
    case '1': prioIndex = " my Friend";
              break;
    case '2': prioIndex = " my Sister and Brother";
              break;
    case '3': prioIndex = " my Mom and Dad";
              break;
  }

  return prioIndex;
}

var string3;
news.onchange = function () { 
  string3 = string2() + ' how are you';
  alert(string3);
}