javascript - ändern - title tag wordpress




Wie verwandle ich einen String in einen JavaScript-Funktionsaufruf? (9)

Basiert auf Nicolas Gauthier Antwort:

var strng = 'someobj.someCallback';
var data = 'someData';

var func = window;
var funcSplit = strng.split('.');
for(i = 0;i < funcSplit.length;i++){
   //We maybe can check typeof and break the bucle if typeof != function
   func = func[funcSplit[i]];
}
func(data);

Diese Frage hat hier bereits eine Antwort:

Ich habe eine Zeichenfolge wie:

settings.functionName + '(' + t.parentNode.id + ')';

dass ich in einen Funktionsaufruf wie folgt übersetzen möchte:

clickedOnItem(IdofParent);

Dies muss natürlich in JavaScript erfolgen. Wenn ich eine Warnung auf settings.functionName + '(' + t.parentNode.id + ')'; es scheint alles richtig zu machen. Ich muss nur die Funktion aufrufen, in die es übersetzt werden würde.

Legende:

settings.functionName = clickedOnItem

t.parentNode.id = IdofParent

Das hat eine Weile window['someFunctionName']() bis ich herausgefunden habe, dass das herkömmliche window['someFunctionName']() zunächst nicht für mich funktionierte. Die Namen meiner Funktionen wurden als AJAX-Antwort aus einer Datenbank abgerufen. Aus irgendeinem Grund wurden meine Funktionen außerhalb des Bereichs des Fensters deklariert. Um dies zu beheben, musste ich die Funktionen, von denen ich anrief, neu schreiben

function someFunctionName() {}

zu

window.someFunctionName = function() {}

und von dort konnte ich das window['someFunctionName']() mit Leichtigkeit window['someFunctionName']() . Ich hoffe, das hilft jemandem!


Ich bevorzuge etwas wie folgt:

window.callbackClass['newFunctionName'] = function(data) { console.log(data) };
...
window.callbackClass['newFunctionName'](data);

Ich wollte in der Lage sein, einen Funktionsnamen als eine Zeichenfolge zu nehmen, sie aufzurufen und ein Argument an die Funktion zu übergeben. Ich konnte die ausgewählte Antwort für diese Frage nicht bekommen, aber diese answer erklärte es genau, und hier ist eine kurze Demo.

function test_function(argument)    {
    alert('This function ' + argument); 
}

functionName = 'test_function';

window[functionName]('works!');

Dies funktioniert auch mit mehreren Argumenten.


JavaScript hat eine eval Funktion, die einen String auswertet und als Code ausführt:

eval(settings.functionName + '(' + t.parentNode.id + ')');

Sehen, wie ich Eval hasse, und ich bin nicht allein :

var fn = window[settings.functionName];
if(typeof fn === 'function') {
    fn(t.parentNode.id);
}

Edit: Als Antwort auf @ Mahans Kommentar: In diesem speziellen Fall wäre settings.functionName "clickedOnItem" . Dies würde zur Laufzeit translate var fn = window[settings.functionName]; in var fn = window["clickedOnItem"] , das einen Verweis auf die function clickedOnItem (nodeId) {} . Sobald wir eine Referenz auf eine Funktion innerhalb einer Variablen haben, können wir diese Funktion aufrufen, indem wir die Variable aufrufen, dh fn(t.parentNode.id) , was clickedOnItem(t.parentNode.id) , was das OP war gewollt.

Mehr vollständiges Beispiel:

/* Somewhere: */
window.settings = {
  /* [..] Other settings */
  functionName: 'clickedOnItem'
  /* , [..] More settings */
};

/* Later */
function clickedOnItem (nodeId) {
  /* Some cool event handling code here */
}

/* Even later */
var fn = window[settings.functionName]; 
/* note that settings.functionName could also be written
   as window.settings.functionName. In this case, we use the fact that window
   is the implied scope of global variables. */
if(typeof fn === 'function') {
    fn(t.parentNode.id);
}

Wenn settings.functionName bereits eine Funktion ist, können Sie Folgendes tun:

settings.functionName(t.parentNode.id);

Ansonsten sollte dies auch funktionieren, wenn settings.functionName nur der Name der Funktion ist:

if (typeof window[settings.functionName] == "function") {
    window[settings.functionName](t.parentNode.id);
}

eval () ist die Funktion, die Sie dazu benötigen, aber ich würde Ihnen raten, eines dieser Dinge zu versuchen, um die Verwendung von eval zu minimieren. Hoffentlich macht einer von ihnen Sinn für Sie.

Speichern Sie die Funktion

Speichern Sie die Funktion als Funktion, nicht als Zeichenfolge, und verwenden Sie sie später als Funktion. Wo Sie die Funktion tatsächlich speichern, bleibt Ihnen überlassen.

var funcForLater = clickedOnItem;

// later is now
funcForLater(t.parentNode.id);

oder

someObject.funcForLater = clickedOnItem;    
// later is now    
(someObject.funcForLater)(t.parentNode.id);

Speichern Sie den Funktionsnamen

Selbst wenn Sie den Funktionsnamen als String speichern müssen, können Sie die Komplexität minimieren

(eval(settings.functionName))(t.parentNode.id);

Das minimiert die Menge an Javascript, die Sie erstellen und prüfen müssen.

Wörterbuch der Handler

Fügen Sie alle benötigten Aktionsfunktionen in ein Objekt ein und rufen Sie sie im Dictionary-Stil mit der Zeichenfolge auf.

// global
itemActions = { click: clickedOnItem, rightClick: rightClickedOnItem /* etc */ };

// Later...
var actionName = "click"; // Or wherever you got the action name
var actionToDo = itemActions[actionName];
actionToDo(t.parentNode.id);

(Kleinere Anmerkung: Wenn Sie stattdessen hier die Syntax itemActions[actionName](t.parentNode.id); verwendet hätten, würde die Funktion als Methode von itemActions .)


window[settings.functionName](t.parentNode.id);

Keine Notwendigkeit für ein eval ()





function