From 8c93869920ec0bf012a0f59175b39449c90a4d1f Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Fri, 13 Jan 2017 13:53:34 +0100 Subject: [PATCH] kivi.call_jquery: Funktion zum Aufrufen beliebiger jQuery-Funktionen MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit An vielen Stellen schicken wir vom Backend aus nur die Namen aufzurufender JavaScript-Funktionen an den Browser. Der sucht dann die auszuführende Funktion mittels »kivi.get_function_by_name« aus dem Namensraum heraus und führt sie anschließend mit »func.apply(…)« aus. Leider ist es damit nicht so einfach möglich, jQuery-Funktionen auszuführen, da diese als »this«-Argument ein jQuery-fiziertes Objekt erwarten. Außerdem geht ein »namespace("jQuery.fn.resetForm")« schlicht nicht bzw. tut nicht das, was man erwartet. Daher die Funktion »kivi.call_jquery«. Ihr übergibt man: 1. einen jQuery-Selektor, der das »this«-Argument der aufzurufenden Funktion repräsentiert, 2. den Namen der aufzurufenden Funktion und 3. optional weitere Argumente. Würde man z.B. einen Wert in einem Input setzen wollen, so sähe der Aufruf in der Console so aus: kivi.call_jquery('#some_input_field', 'val', '42') Das ist äquivalent zo $('#some_input_field').val('42') Interessant wird die Verwendung an Stellen, wo nur Funktionsnamen übergeben werden dürfen, z.B. bei »call«-Actions bei der ActionBar. Hier sähe z.B. eine Action zum Zurücksetzen einer Form wie folgt aus: action => [ t8('Reset'), call => [ 'kivi.call_jquery', '#form', 'resetForm' ], ], Beim Anklicken wird dann letztlich das Äquivalent hierzu ausgeführt: $('#form').resetForm() --- js/kivi.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/js/kivi.js b/js/kivi.js index 27077575d..5ff3ce6ef 100644 --- a/js/kivi.js +++ b/js/kivi.js @@ -313,6 +313,23 @@ namespace("kivi", function(ns) { history.back(); }; + // Call arbitrary jQuery functions on arbitrary objects with + // arbitrary arguments. The use case is to allow eval_json_result + // using code to call simple jQuery stuff without having it to wrap + // them in their own small functions. + // Example usage with ActionBar: + // call => [ 'kivi.call_jquery', '#form', 'resetForm' ], + ns.call_jquery = function(this_arg, function_name) { + var func = jQuery.fn[function_name]; + if (!func) + return; + + var args = Array.from(arguments); + args.splice(0, 2); + + return func.apply($(this_arg), args); + }; + // Return a function object by its name (a string). Works both with // global functions (e.g. "check_right_date_format") and those in // namespaces (e.g. "kivi.t8"). -- 2.20.1