是的,有很多问题,例如如何将字符串转换为javascript函数调用?或者当我将其名称作为字符串时如何执行JavaScript函数.
但是,如果我们没有普通的函数名称,而是实际上是函数的对象属性名称呢?
喜欢:
var callMe = 'foo.bar.baz';
Run Code Online (Sandbox Code Playgroud)
和期望被调用的代码是:
window.foo = {
bar: {
baz: function() {
alert('Eureka!');
}
}
};
Run Code Online (Sandbox Code Playgroud)
为什么我需要这个:回调参数通过url传递,它可以(通过应用程序设计)是函数名或对象属性的FQN.
除了以外的任何想法eval()?
UPD:
我最后的实施:
var parts = callbackName.split('.'),
callback;
for (i in parts) {
if (!callback) {
callback = window[parts[i]];
} else {
callback = callback[parts[i]];
}
if (typeof callback === 'undefined') break;
}
if (typeof callback === 'function') {
callback();
} else {
console.error('Passed callback is not a valid function');
}
Run Code Online (Sandbox Code Playgroud) 我有一个服务器端Python脚本,它返回一个包含客户端JavaScript参数的JSON字符串.
# Python
import simplejson as json
def server_script()
params = {'formatting_function': 'foobarfun'}
return json.dumps(params)
Run Code Online (Sandbox Code Playgroud)
这foobarfun应该引用JavaScript函数.这是我的主要客户端脚本
// JavaScript
function client_script() {
var xhr = new XMLHttpRequest();
xhr.open("GET", url, async=true);
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
options = JSON.parse(xhr.responseText);
options.formatting_function();
}
};
xhr.send(null);
}
function foobarfun() {
//do_something_funny_here...
}
Run Code Online (Sandbox Code Playgroud)
当然,options.formatting_function()会抱怨"字符串不可调用"或类似的东西.
在使用Chrome的Inspect Element后,在Resources选项卡下,并导航左侧边栏以进行XHR>查询,我发现client_script解释options如下.foobarfun被视为一个字符串.
// JavaScript
options = {"formatting_function": "foobarfun"}
Run Code Online (Sandbox Code Playgroud)
我本来希望client_script看到options的
// …Run Code Online (Sandbox Code Playgroud) 我有一个带有一组原型方法的对象.如何调用给定的名称和arg列表?
所以我有和反对:
scarpa.MyThing = function() {
}
Run Code Online (Sandbox Code Playgroud)
MyThing 有一个原型方法:
scarpa.MyThing.prototype.beAwesome = function(a, b, c) {
// do awesome stuff here with a, b, and c
}
Run Code Online (Sandbox Code Playgroud)
现在,我想beAwesome从另一个原型方法调用:
scarpa.MyThing.prototype.genericCaller = function(methodName, d, e, f) {
// this does not work for me
this.call(methodName, d, e, f)
}
Run Code Online (Sandbox Code Playgroud)
以下是致电genericCaller:
this.genericCaller('beAwesome', alpha, zeta, bravo);
Run Code Online (Sandbox Code Playgroud)
我坚持使用正确的语法进行调用genericCaller.
有人可以赐教吗?谢谢.
这是问题 - 我知道函数的名称(并且该函数已经从外部脚本加载),但我没有实际的函数对象可供我调用.通常我会调用eval(function_name +"(arg1,arg2)"),但在我的情况下,我需要传递一个对象,而不是字符串.简单的例子:
var div = document.getElementById('myDiv')
var func = "function_name" -- this function expects a DOM element passed, not id
Run Code Online (Sandbox Code Playgroud)
我该如何执行这个功能?
谢谢!安德烈
好吧,我正在使用一些jquery创建动态弹出窗口.但是,定期响应将是我需要调用的函数的名称而不是实际数据,我试图弄清楚如何执行此操作.
success: function(response) {
var obj = $.parseJSON(response);
if (obj.response == 'false') {
$('#popuperrDisplay').html(obj.msg);
$('#popuperrors').show();
} else {
if (obj.response == 'redirect') {
window.location.href = obj.msg;
} else if (obj.response == 'function') {
call obj
} else {
$(this).dialog('close');
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的jquery的当前部分.我需要弄清楚如何通过json_encode发送JS函数的名称,并让JS实际调用该函数
今天在接受采访时(初级网络开发者),面试官问我这个问题:
如何将名称作为字符串(在javascript和C#中)执行方法
我不能回答:(
现在,当我搜索时,我发现了这个问题当我将其名称作为字符串时如何执行JavaScript函数
但是如何在c#中做到这一点?
我有一个自动完成功能,回调数据返回.许多不同的实例都使用此自动完成功能.
$.fn.acItem = function(callback){
var self = this;
$(self).autocomplete({
(...)
select: function(e, ui){
// Eval for calling anonymous function (right?)
window[callback](ui.item);
}
});
};
Run Code Online (Sandbox Code Playgroud)
我也在使用命名空间
var Agency = {
init: function() {
var self = this;
self.registerAgency.addItem();
},
registerAgency: {
(...)
addItem: function(item){
if(!item){
(...)
// Initiate autocomplete on input
$('.search-item').acItem('Agency.registerAgency.addItem');
} else {
// Do something with Item
}
}
}
Agency.init();
Run Code Online (Sandbox Code Playgroud)
window[callback](ui.item)如果我没有使用命名空间,请使用作品.但是对于命名空间,它会变得有点复杂,如Jason Bunting所描述的那样.
由于使用了不同的命名空间acItem(),因此需要知道在回调中调用哪个函数.但许多人强烈反对使用Eval来调用匿名函数.
那么对匿名函数进行回调的好方法是什么?
我在HTML中输入以下内容:
<div class="form-group">
<label for="siretNumber">Numéro de SIRET</label>
<input onkeyup="checkSIRET(this);" onfocusout="ocr_on_fly(true, this, true)" onfocusin="ocr_on_fly(false, this, true);" type="text" class="form-control" id="siretNumber" value="{{ pdf['siret'] }}">
</div>
<div class="form-group">
<label for="sirenNumber">Numéro de SIREN</label>
<input onkeyup="checkSIREN(this)" onfocusout="ocr_on_fly(true, this, true)" onfocusin="ocr_on_fly(false, this, true)" type="text" class="form-control" id="sirenNumber" value="{{ pdf['siret'] }}">
</div>
Run Code Online (Sandbox Code Playgroud)
在ocr_on_fly功能上,我需要自动执行onkeyup属性的功能。通过下面的代码,我得到了onkeyupattr 的值,但是我该如何执行呢?
let attr = input.getAttribute('onkeyup')
// attr = checkSIRET(this); or attr = checkSIREN(this);
Run Code Online (Sandbox Code Playgroud)
提前致谢
我们要连接函数名称和变量名称。单击<a>标签应发生这种情况。
我们如何连接函数和变量名?
问题:
所需的输出:
fn_dataId() should be fn_some123();
我们尝试了什么
$(function() {
$('.link').on('click', function() {
console.log('clicked');
var dataId = $(this).attr('data-id');
console.log('data id - ' + dataId);
// What we tried, but didn't work.
fn_dataId();
});
});Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a data-id="some123" class="link">
Click here
</a>Run Code Online (Sandbox Code Playgroud)
我正在循环访问各种文件,并试图找到一种方法来动态列出/捕获尽可能多的来自GAS 文件对象的信息。
如果我采用非动态方法,我会输入我想要捕获的每个属性,如下所示:
var zText = 'File Id:' + aFile.getId();
zText += "\n" + "getName: " + aFile.getName();
zText += "\n" + "getDateCreated: " + aFile.getDateCreated();
zText += "\n" + "getSize: " + aFile.getSize();
Run Code Online (Sandbox Code Playgroud)
ETC...
虽然上述方法最终会得到我想要的,但我想避免查找所有属性名称。我知道许多属性可能无法转换为字符串,但我希望至少按名称将它们隔离。
我认为我的问题与使用 stringify 的问题类似。但是,这不适用于 Google File 对象(它只返回字符串值{})。我猜这是因为很多属性都在调用函数?
我可以使用以下命令获取作为字符串列出的文件的所有属性/函数:Object.keys(aFile).forEach((prop)=> Logger.log(prop ));
但是,这不会返回每个函数的结果,其中许多是我不想执行的函数(即makeCopy)。
虽然可能有更好的方法,但我假设尝试执行以或开头的所有属性/函数可能是安全的。我不知道如何做到这一点,也找不到任何与此类用例匹配的内容。我确实看到了这篇关于使用executeFunctionByName的文章,但这在应用程序脚本环境中不起作用。如果它确实有效,我会使用类似的东西..getis
var allKeys = Object.keys(aFile);
for(var i=0;i<allKeys.length;i++){
var eachProperty = allKeys[i];
if(eachProperty.search(RegExp("^get|^is"))>-1 ){
//??? run …Run Code Online (Sandbox Code Playgroud)