Clients script or any script onchange any variables

rolodo
Mega Contributor

I have a script that I need to run on many variables on change.

does servicenow provide a way to do it.

here's an example :

include script to get the variables, orders and names

var Variable_Indentifier = Class.create();

Variable_Indentifier.prototype = Object.extendsObject(AbstractAjaxProcessor, {

  isnotinvariableset : function() {

  var catItem = this.getParameter('sysparm_cat_item_sysid');

  var gr = new GlideRecord('item_option_new');

  gr.addQuery('cat_item', catItem);

  gr.query();

  var variables = new Array();

  while(gr.next()){

  var myvar = {sys_id:gr.sys_id.toString(), name:gr.name.toString(), order:gr.order.toString()};

  variables.push(myvar);

  }

  return (JSON.stringify(variables));

  }

});

client script to get what variable to reset from the include script

function onLoad() {

    //Type appropriate comment here, and begin script below

    var gaValid = new GlideAjax('Variable_Indentifier');

  gaValid.addParam('sysparm_name','isnotinvariableset');

  gaValid.addParam('sysparm_cat_item_sysid',$('sysparm_id').value);

  gaValid.getXMLWait();

  answer = gaValid.getAnswer();

  window.toreset = JSON.parse(answer);

  console.log("-----------------------------------------"+window.toreset[0].order);

}

and the script that trigger on edit of some variables that reset all other variables under it :

function onChange(control, oldValue, newValue, isLoading) {

  if (isLoading || newValue == '') {

  return;

  }

  //need the client script : Find variables to reset

  if(window.toreset != null){

  var myorder = findOrder(control);

  var myname = findName(control);

  //window.toreset.length

  console.log(window.toreset[56].name)

  for(i = 0; i < window.toreset.length; i++){

  if(window.toreset[i].name != myname && window.toreset[i].order >= myorder && window.toreset[i].name != 'ba_select_location' && window.toreset[i].name != 'ba_ipPhone_display_name')

  {

  g_form.setValue(window.toreset[i].name.toString(), '');

  }

  }

  }

}

function findOrder(control)

{

  var myorder = 0;

  for(i = 0; i< window.toreset.length; i++){

  if(window.toreset[i].sys_id == control.name.substring(3, 35)){

  myorder = (window.toreset[i].order);

  }

  }

  return myorder;

}

function findName(control)

{

  var myname = 0;

  for(i = 0; i< window.toreset.length; i++){

  if(window.toreset[i].sys_id == control.name.substring(3, 35)){

  myname = (window.toreset[i].name);

  }

  }

  return myname;

}

first, onload I get all the variables of my item

and after if I change a variables that influence something under it I trigger the script that clean (set varaible to '')
for now it trigger onchange of these variables so I have many client script

I would like to have only one script that will do this
(I'm thinking to use a onload script with some EventListener)

Thanks, I speak french so sorry for my bad english

1 ACCEPTED SOLUTION

rolodo
Mega Contributor

So now I only have this script include



var Variable_Indentifier = Class.create();  


 


Variable_Indentifier.prototype = Object.extendsObject(AbstractAjaxProcessor, {  


  isnotinvariableset : function() {  


  var catItem = this.getParameter('sysparm_cat_item_sysid');  


  var gr = new GlideRecord('item_option_new');  


  gr.addQuery('cat_item', catItem);  


  gr.query();  


  var variables = new Array();  


  while(gr.next()){  


  var myvar = {sys_id:gr.sys_id.toString(), name:gr.name.toString(), order:gr.order.toString()};  


  variables.push(myvar);  


  }  


  return (JSON.stringify(variables));  


  }  


});  



and this client script onload



function onLoad() {


  //Type appropriate comment here, and begin script below


  var gaValid = new GlideAjax('Variable_Indentifier');


  gaValid.addParam('sysparm_name','isnotinvariableset');


  gaValid.addParam('sysparm_cat_item_sysid',$('sysparm_id').value);


  gaValid.getXMLWait();


  answer = gaValid.getAnswer();


  window.toreset = JSON.parse(answer);


  document.addEventListener('change', resetUnderVariables, false);


}



function resetUnderVariables(e){


  var executeon = [


  "ab05f8fa6fbd46007d319e4eae3ee451",


  "be16d1f26ffd46007d319e4eae3ee487",


  "d2a591f26ffd46007d319e4eae3ee451",


  "323f85826f2e46007d319e4eae3ee436",


  "6bfc2c7a6fbd46007d319e4eae3ee46c",


  "e21134fa6fbd46007d319e4eae3ee494",


  "23f274fa6fbd46007d319e4eae3ee4d6",


  "327afb9c6f8bca00d6a2f35d5d3ee47c",


  "581888246fcbca00d6a2f35d5d3ee4a3",


  "7ac8c0646fcbca00d6a2f35d5d3ee421",


  "c2ef77506fcbca00d6a2f35d5d3ee433",


  "63c990ec6fcbca00d6a2f35d5d3ee470",


  "47f54ce06fcbca00d6a2f35d5d3ee4b5",


  "8c95c8e06fcbca00d6a2f35d5d3ee4f8",


  "4647c4246fcbca00d6a2f35d5d3ee4a9",


  "a7ed04366fbd46007d319e4eae3ee42c",


  "c80dc8f26fbd46007d319e4eae3ee407",


  "f01478fa6fbd46007d319e4eae3ee459",


  "47f54ce06fcbca00d6a2f35d5d3ee4b5",


  "3a6515f26ffd46007d319e4eae3ee43c",


  "9cdf20fa6fbd46007d319e4eae3ee465",


  "56a05c366fbd46007d319e4eae3ee411"];


  console.log(e.target.id);


  control = e.target.id.substring(3, 35);


  console.log(control);


  if(window.toreset != null && executeon.indexOf(control) > -1){


  var myorder = findOrder(control);


  var myname = findName(control);


  for(i = 0; i < window.toreset.length; i++){


  if(window.toreset[i].name != myname && window.toreset[i].order >= myorder && window.toreset[i].name != 'ba_select_location' && window.toreset[i].name != 'ba_ipPhone_display_name')


  {


  g_form.setValue(window.toreset[i].name.toString(), '');


  }


  }


  }


}



function findOrder(control)


{


  var myorder = 0;


  for(i = 0; i< window.toreset.length; i++){


  if(window.toreset[i].sys_id == control){


  myorder = (window.toreset[i].order);


  }


  }


  return myorder;


}



function findName(control)


{


  var myname = 0;


  for(i = 0; i< window.toreset.length; i++){


  if(window.toreset[i].sys_id == control){


  myname = (window.toreset[i].name);


  }


  }


  return myname;


}



I hope this can help others


View solution in original post

5 REPLIES 5

Chuck Tomasi
Tera Patron

Hi David,



The short answer is that an onChange client script watches one field or variable at a time. If you want to watch multiple variables or fields, you need multiple client scripts.



Reference:


Client Scripts - ServiceNow Wiki


Chuck Tomasi
Tera Patron

And for what it is worth, your English is better than my French.


Hi Chuck, I'll try to do a onload script with EventListener and I'll let you know if it works



Thanks!


rolodo
Mega Contributor

So now I only have this script include



var Variable_Indentifier = Class.create();  


 


Variable_Indentifier.prototype = Object.extendsObject(AbstractAjaxProcessor, {  


  isnotinvariableset : function() {  


  var catItem = this.getParameter('sysparm_cat_item_sysid');  


  var gr = new GlideRecord('item_option_new');  


  gr.addQuery('cat_item', catItem);  


  gr.query();  


  var variables = new Array();  


  while(gr.next()){  


  var myvar = {sys_id:gr.sys_id.toString(), name:gr.name.toString(), order:gr.order.toString()};  


  variables.push(myvar);  


  }  


  return (JSON.stringify(variables));  


  }  


});  



and this client script onload



function onLoad() {


  //Type appropriate comment here, and begin script below


  var gaValid = new GlideAjax('Variable_Indentifier');


  gaValid.addParam('sysparm_name','isnotinvariableset');


  gaValid.addParam('sysparm_cat_item_sysid',$('sysparm_id').value);


  gaValid.getXMLWait();


  answer = gaValid.getAnswer();


  window.toreset = JSON.parse(answer);


  document.addEventListener('change', resetUnderVariables, false);


}



function resetUnderVariables(e){


  var executeon = [


  "ab05f8fa6fbd46007d319e4eae3ee451",


  "be16d1f26ffd46007d319e4eae3ee487",


  "d2a591f26ffd46007d319e4eae3ee451",


  "323f85826f2e46007d319e4eae3ee436",


  "6bfc2c7a6fbd46007d319e4eae3ee46c",


  "e21134fa6fbd46007d319e4eae3ee494",


  "23f274fa6fbd46007d319e4eae3ee4d6",


  "327afb9c6f8bca00d6a2f35d5d3ee47c",


  "581888246fcbca00d6a2f35d5d3ee4a3",


  "7ac8c0646fcbca00d6a2f35d5d3ee421",


  "c2ef77506fcbca00d6a2f35d5d3ee433",


  "63c990ec6fcbca00d6a2f35d5d3ee470",


  "47f54ce06fcbca00d6a2f35d5d3ee4b5",


  "8c95c8e06fcbca00d6a2f35d5d3ee4f8",


  "4647c4246fcbca00d6a2f35d5d3ee4a9",


  "a7ed04366fbd46007d319e4eae3ee42c",


  "c80dc8f26fbd46007d319e4eae3ee407",


  "f01478fa6fbd46007d319e4eae3ee459",


  "47f54ce06fcbca00d6a2f35d5d3ee4b5",


  "3a6515f26ffd46007d319e4eae3ee43c",


  "9cdf20fa6fbd46007d319e4eae3ee465",


  "56a05c366fbd46007d319e4eae3ee411"];


  console.log(e.target.id);


  control = e.target.id.substring(3, 35);


  console.log(control);


  if(window.toreset != null && executeon.indexOf(control) > -1){


  var myorder = findOrder(control);


  var myname = findName(control);


  for(i = 0; i < window.toreset.length; i++){


  if(window.toreset[i].name != myname && window.toreset[i].order >= myorder && window.toreset[i].name != 'ba_select_location' && window.toreset[i].name != 'ba_ipPhone_display_name')


  {


  g_form.setValue(window.toreset[i].name.toString(), '');


  }


  }


  }


}



function findOrder(control)


{


  var myorder = 0;


  for(i = 0; i< window.toreset.length; i++){


  if(window.toreset[i].sys_id == control){


  myorder = (window.toreset[i].order);


  }


  }


  return myorder;


}



function findName(control)


{


  var myname = 0;


  for(i = 0; i< window.toreset.length; i++){


  if(window.toreset[i].sys_id == control){


  myname = (window.toreset[i].name);


  }


  }


  return myname;


}



I hope this can help others