【问题标题】:Global variable not changing on event全局变量不随事件改变
【发布时间】:2013-10-01 23:44:01
【问题描述】:

我有一个名为 userValue 的全局变量。当页面加载时,此值正在查找所选选项并存储该选项值。加载时它将存储默认值或 null,因为该选项已禁用。但是,onchange(每个站点动态填充更多选项),我试图全局存储所选选项的值,以便我可以简单地继续重用变量 userValue。当我包含以下内容时,我下面的内容可以正常工作:

   userValue = $('#my_SiteUsers').find(':selected').val(); 

在 RefreshGroupList() 函数中,但如果我必须这样做,这不会违背拥有全局变量的目的吗?现在,我所做的任何更改都会返回“默认”

HTML:

 <select id="my_SiteUsers" style="width:200px;" onchange="RefreshGroupLists()">
        <option value='default' disabled="disabled">Select a user</option>
      </select>

JS:

  var user, userValue, userText, group, strHTMLSiteUsers, strHTMLSiteGroups, strHTMLAvailable, strHTMLAssigned, arrOptionsAssigned, arrGroups, arrUsers, intOpts, booMatch, booErr;

        $(document).ready(function(){ 
            user = $('#m

y_SiteUsers');
        userValue = $('#my_SiteUsers').find(':selected').val();
        userText = $('#my_SiteUsers').find(':selected').text();
        group = $('#my_SiteGroups');
        groupsAssigned = $("#my_SPGroupsAssigned").html("");
        groupAvailable = $("#my_SPGroupsAvailable").html("");
        userAssigned = $("#my_SPUsersAssigned").html("");
        userAvailable = $("#my_SPUsersAvailable").html("");

        $("button").click(function() { return false; });

        populateUsers();
            populateGroups();
        });


function RefreshGroupLists(){
            //Populate the Groups Assigned
          $().SPServices({
              operation: "GetGroupCollectionFromUser",
              userLoginName: userValue,
              async: true,
              completefunc: function(xData, Status) {
                $(xData.responseXML).find("errorstring").each(function() {
                  alert("User not found");
                  booErr = "true";
                  return;
                });
                $(xData.responseXML).find("Group").each(function() {
                  strHTMLAvailable += "<option value='" + $(this).attr("Name") + "'>" + $(this).attr("Name") + "</option>";
                  arrOptionsAssigned[intOpts] = $(this).attr("Name");
                  intOpts = intOpts + 1;
                });
                groupsAssigned.append(strHTMLAvailable);
              }
          });
}

JSFiddle

【问题讨论】:

  • 那个javascript在哪里?正文或头部或外部js文件中的内部脚本标记?
  • $ 未定义:您需要在小提琴中包含 jQuery :)
  • @watson 对不起,我只在 jsfiddle 中发布了相关代码,而不是全部内容。我的网站有 Jquery 和其他所需的框架。
  • @UFL1138 它在一个外部文件中

标签: javascript jquery variables global-variables


【解决方案1】:

由于您打算将 $('#my_SiteUsers').find(':selected').val() 的值更改为您所做的分配它并没有真正帮助您。字符串值是按值复制的,您需要参考。

您可以做的只是保留对 DOM 元素的引用:

 userValueHolder = $('#my_SiteUsers').find(':selected')

并在需要时通过useuserValueHolder.val()请求该值

【讨论】:

  • 这不起作用,因为如果所选用户更改,userValueHolder 的值不会更改。他想要的是使用一个简单的变量神奇地跟踪选定的选项——这在 javascript 中不太可能,尽管可以将处理程序附加到 onchange 事件以进行选择并将当前选定的选项分配给全局变量——但他已经这样做。他想要的是在不使用 onchange 的情况下神奇地跟踪当前选择的值。
【解决方案2】:

我会do something like this.

// window.userValue = ''; // not necessary

$(document).ready(function(){
    var userValue;

    $('#my_SiteUsers').on('change', function(){
        RefreshGroupLists();
    });

    function RefreshGroupLists(){
        userValue = $('#my_SiteUsers').find(':selected').val();
        alert(userValue);
    }  
});

最好将事件处理程序保留在您的 JS 中,而不是 HTML 中,并声明全局变量,尽管您实际上不需要为此使用全局变量,但您需要对 userValue 执行的任何操作都可以放在 RefreshGroupLists 中。

【讨论】:

  • 我打算在其他函数中使用 userValue。所以我唯一的选择是把 userValue = $('#my_SiteUsers').find(':selected').val();在我需要它的每个功能中?
  • 我会在你的 doc ready 函数的顶部声明它,但是一旦你的应用程序达到一定的复杂程度(可能超过 400 行),我会研究 requireJS ,它可以让你定义你的 JS很好。
  • 这个应用程序肯定会达到+400行。已经是350左右了。我会看看requireJS,但现在我会试试你发布的内容。谢谢
  • @Batman:不,您只需要在选择更改时包含代码,在本例中为onchange 事件。您的困惑源于您还想在选择值更改时调用 RefreshGroupLists,因此您误解了将新值分配给 userValue 与调用 RefreshGroupLists 的相关性。
  • 为避免混淆,我认为您应该在 onchange 事件处理程序中但在 RefreshGroupLists 之外(之前)分配 userValue。这将清楚地向您表明,设置 userValue 和调用 RefreshGroupLists 是两件不同的事情,如果您需要在 onchange 事件之外调用 RefreshGroupLists,那么您不需要分配 userValue。
猜你喜欢
  • 2019-02-08
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多