• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Externe Funktion erweitern

mrperformer

New member
Neues Thema aus http://forum.jswelt.de/javascript/59836-trick-f-r-uri.html :

Es gibt eine bestehende JS-Funktion, die von verschiedenen bestehenden Punkten aus aufgerufen wird. Ich möchte diese Funktion erweitern oder ein Callback erhalten, um eigenen Code auszuführen.

Dabei soll weder die bestehende Funktion angefasst werden noch sollen die Aufrufe umgeschrieben werden, da es sich um eine externe Komponente handelt, die auch mal upgedated wird.

Gibt es die Möglichkeit, eine Funktion zu ergänzen oder Ihren Aufruf abzufangen?
 
Gibt es die Möglichkeit, eine Funktion zu ergänzen oder Ihren Aufruf abzufangen?
So allgemein nicht.

Aber wenn es eine globale Funktion ist und sie auch aus der globalen Variable heraus aufgerufen wird, kannst du sie einfach ersetzen und in der neuen Funktion die alte (jetzt anders referenziert) aufrufen:
HTML:
<!DOCTYPE html>

<html>
<head>
<title>Fenstertitel</title>
<script type="text/javascript">
function test(){
	"use strict";
	
	alert("test");
}

function extend(){
	"use strict";
	
	var internTest = test;
	test = function(){
		alert("before test");
		internTest.apply(this, arguments);
		alert("after test");
	}
}
</script>
<style type="text/css"></style>
</head>
<body>
<button onclick="test()">call test()</button>
<button onclick="extend()">extend test</button>
</body>
</html>
 
Es gibt eine bestehende JS-Funktion, die von verschiedenen bestehenden Punkten aus aufgerufen wird. Ich möchte diese Funktion erweitern oder ein Callback erhalten, um eigenen Code auszuführen.

Dabei soll weder die bestehende Funktion angefasst werden noch sollen die Aufrufe umgeschrieben werden, da es sich um eine externe Komponente handelt, die auch mal upgedated wird.

Gibt es die Möglichkeit, eine Funktion zu ergänzen oder Ihren Aufruf abzufangen?
kommt auf den einsatztzweck an
esprima ist ein mozilla AST kompatiebler js parser in js geschrieben
escodegen ein js codegenerator mit AST input bzw sollte für deine zwecke esmorph ausreichend sein.
damit kannst du js parsen, anpassen und wieder js generieren.
allerdings würde ich das nicht zum anpassen von bestehendem code im produktiveinsatz verwenden
 
Ich verstehe nicht, wie das bei dem Problem hier helfen soll. Wie hast du dir da den Ablauf vorgestellt?
 
Ja und? Der Originalcode soll ja nicht geändert oder anders geladen werden. Es existieren einfach nur die Funktionen in JS und damit kann man mit Esprima nicht zugreifen.
 
Der Originalcode soll ja nicht geändert ... werden.
wird er ja auch nicht

oder anders geladen werden.
woher nimmst du das? und welchen sinn sollte es haben, ein modul anders zu laden ist ja das kleinste problem.

Es existieren einfach nur die Funktionen in JS und damit kann man mit Esprima nicht zugreifen.
es existiert eine externe komponente, mit der er etwas machen möchte:
Es gibt eine bestehende JS-Funktion, die von verschiedenen bestehenden Punkten aus aufgerufen wird. Ich möchte diese Funktion erweitern oder ein Callback erhalten, um eigenen Code auszuführen.

Dabei soll weder die bestehende Funktion angefasst werden noch sollen die Aufrufe umgeschrieben werden, da es sich um eine externe Komponente handelt, die auch mal upgedated wird.

genau das passiert in dem beispiel, eine bestehende funktion wird erweitert ohne sie extra anzupassen. und gleichzeitig wird auch eine sinnvolle einsatzmöglichkeit gezeigt - code profiling.
will er also eine testumgebung bauen, wo regelmäßig komponenten geprofilt werden, oder die testabdeckung überprüft werden soll, ob alle funktionen beim test durchlaufen werden, oder alle if/else zweige oder geprüft werden soll, ob überhaupt alle funktionen benötigt werden, oder ob noch irgendwo funktionsleichen rumgammeln, oder oder oder, und das alles, ohne den originalcode anfassen zu müssen, dann kann man das über esprima/escodegen guten gewissens lösen.

will er allerdings in einem modul eine funktion funktionell erweitern, "könnte" man das auch über esprima/escodgen lösen, das würde ich dann allerdings nicht mehr als sinnvoll bezeichnen.
 
wird er ja auch nicht
Der JS-Code nicht, aber das dazugehörige HTML.
woher nimmst du das?
Ich hab' den anderen Thread so verstanden, dass ein Modul/Extension/AddOn für ein CMS verwendet wird, dass hier angepasst werden muss. Damit das natürlich auch nach Updates noch funktioniert, darf am HTML/JS/Serverseitigen nichts geändert werden.

eine testumgebung
Aber darum geht es hier doch gar nicht...

in einem modul eine funktion funktionell erweitern
Genau das will er machen (ich hab' das jedenfalls so verstandne). Les' dir einfach den anderen Thread durch.
 
Der JS-Code nicht, aber das dazugehörige HTML.
sehe ich nocht nicht so

Ich hab' den anderen Thread so verstanden, dass ein Modul/Extension/AddOn für ein CMS verwendet wird, dass hier angepasst werden muss. Damit das natürlich auch nach Updates noch funktioniert, darf am HTML/JS/Serverseitigen nichts geändert werden.
das hatte ich mir gar nicht angesehen, dann hat rico2009 doch schon in #1 den einzig richtigen weg aufgezeigt. dem anker einen klick-eventghandler zuweisen und gut.

Genau das will er machen (ich hab' das jedenfalls so verstandne). Les' dir einfach den anderen Thread durch.
ja, haste recht
 
sehe ich nocht nicht so
Ich meine das HTML, das das JS läd'. Und das soll ja auch nicht verändert werden.

dem anker einen klick-eventghandler zuweisen und gut.
Stimme ich dir voll und ganz zu. Hier ist die Situation nur etwas anders/seltsam. Ich würde ja dem Modulentwickler fragen, ob er da nicht eine JS-Integration mit einbauen will. Sollte ja nicht so schwer sein.

Gut, dass wir uns einig sind.

Prinzipiell find' ich die Sachen, die man mit esprima und co. machen kann extrem spannend und zur Entwicklung hilfreich.
 
Zurück
Oben