将多个 Select 值传递给 Javascript API 函数

Pass Multiple Select Values to a Javascript API function

我会保持这个简单。首先,这些是从较大文档中提取的片段。所以是的,我有正确的 headers 和来源参考等

我有一个 select 盒子。我知道如何根据单个值 selection 调用函数。我想知道当 select 框允许 multiple 值时如何具体调用此函数 showOnly()

select框是

 <select id="select_a" name="color" multiple>
     <option selected="selected" class="options">Select desired detail</option>
     <option value="None" class="options" >None</option>        
     <option value="Investment Category" class="options">Investment Category</option>
     <option value="Company" class="options">Company</option>
     <option value="Budget Line" class="options">Budget Line</option>
     <option value="Market" class="options">Market</option>
     <option value="Organization" class="options">Organization</option>
     <option value="Segment" class="options">Segment</option>  
 </select> 

那么,如何将 multiple 值连接到下面的函数 showOnly()。使用一个值,showOnly() 可能看起来像这样 showOnly('Segment','Cars')。我知道具有多个值的 showOnly 会喜欢 showOnly('Segment,['Cars','Boats','Planes'])。这是函数 showOnly()

function showOnly(filterName, values) {
  sheet = mainViz.getWorkbook().getActiveSheet();
  if(sheet.getSheetType() === 'worksheet') {
    sheet.applyFilterAsync(filterName, values, 'REPLACE');
  } else {

    worksheetArray = sheet.getWorksheets();
    for(var i = 0; i < worksheetArray.length; i++) {
        worksheetArray[i].applyFilterAsync(filterName, values, 'REPLACE');
      }
   }
};

想法?? //感谢您的考虑。

 var colOfSelectedOpt = document.getElementById("select_a").selectedOptions;

 var values = [];
 for(var i=0;i<colOfSelectedOpt.length;i++) {
         values.push(colOfSelectedOpt[i].value);
    }

values 应该给你 selected 项目数组。您可以在调用之前将其传递给函数或传递 select 的 id 并在函数内获取值。

更新

function showOnly(filterName, idOfSelect) {

    var colOfSelectedOpt = document.getElementById(idOfSelect).selectedOptions;

    var values = [];
    for(var i=0;i<colOfSelectedOpt.length;i++) {
         values.push(colOfSelectedOpt[i].value);
    }      

 sheet = mainViz.getWorkbook().getActiveSheet();
     if(sheet.getSheetType() === 'worksheet') {
         sheet.applyFilterAsync(filterName, values, 'REPLACE');
      } else {

         worksheetArray = sheet.getWorksheets();
         for(var i = 0; i < worksheetArray.length; i++) {
        worksheetArray[i].applyFilterAsync(filterName, values, 'REPLACE');
       }
  }
 };

每当您调用 showOnly() 方法时,传递 select dom 的 id,您希望为其调用此函数。

 <select id="select_a" name="color" onchange="showOnly('filterName', this.getAttribute('id'));" multiple>

或者,如果您希望 selection 在其他按钮上工作,则通过 id 从关联的 select 下拉列表中获取并 id 并将其传递给函数。

由于 HTMLOptionsCollection 是类似数组的对象,我不熟悉使用 Array.prototype.map() 创建新的选定值数组的任何方法。但是我们总是可以使用老式的 for 循环。这是一个 ES6 方法:

const select = document.getElementById('select_a');
const on_change = (event) => {
  const options = event.target.options;
  let values = [];
  for (var i = 0; i < options.length; i++) {
    if (options[i].selected) {
          values.push(options[i].value);
    }
  }

  console.log('Pass these values to your function:', values);
};

select.addEventListener('change', on_change);

JS斌:http://jsbin.com/yemoxizaso/1/edit?js,console,output

如果您不能使用 ES6,这里有一个 ES5 方法:

var select = document.getElementById('select_a');
var on_change = function(event) {
  var options = event.target.options;
  var values = [];
  for (var i = 0; i < options.length; i++) {
    if (options[i].selected) {
          values.push(options[i].value);
    }
  }

  console.log('Pass these values to your function:', values);
};

select.addEventListener('change', on_change);

有一个名为 argumentsFunction 作为 属性 的内置对象,它是一个可以传入无限量值的局部变量。 arguments 类似于数组,因为它会索引给定的每个值,并且它有几个方法,包括长度。我不知道我的示例是否有效,因为没有提供一半的函数和变量。 collArgs() 应该能够采用一些参数和 return 以类似索引数组的方式获取值。从那里,我已经指定 values 来存储 arguments 的值,现在它可以传递到您的函数中。

请阅读此 article 以获得更好的解释和工作示例 args = 新参数()

function collArgs() {
  for (var i = 0; i < arguments.length; i++) {
   arguments[i];
  }
  return arguments;
}

var values = collArgs();

function showOnly(filterName, values) {
  var sheet = mainViz.getWorkbook().getActiveSheet();
  if(sheet.getSheetType() === 'worksheet') {
    sheet.applyFilterAsync(filterName, values, 'REPLACE');
  } else {

    var worksheetArray = sheet.getWorksheets();
    for(var i = 0; i < worksheetArray.length; i++) {
        worksheetArray[i].applyFilterAsync(filterName, values, 'REPLACE');
      }
   }
};