diff --git a/includes/ajax.inc b/includes/ajax.inc index 2fd7f69410713d0a57545702308ab899e501e60b..24824a63f3e70cc7ca5b925439ca83cd5ad51603 100644 --- a/includes/ajax.inc +++ b/includes/ajax.inc @@ -1002,7 +1002,7 @@ function ajax_command_changed($selector, $asterisk = '') { * The 'css' command will instruct the client to use the jQuery css() method * to apply the CSS arguments to elements matched by the given selector. * - * This command is implemented by Drupal.ajax.prototype.commands.insert() + * This command is implemented by Drupal.ajax.prototype.commands.css() * defined in misc/ajax.js. * * @param $selector @@ -1087,6 +1087,37 @@ function ajax_command_data($selector, $name, $value) { ); } +/** + * Creates a Drupal AJAX 'invoke' command. + * + * The 'invoke' command will instruct the client to invoke the given jQuery + * method with the supplied arguments on the elements matched by the given + * selector. Intended for simple jQuery commands, such as attr(), addClass(), + * removeClass(), toggleClass(), etc. + * + * This command is implemented by Drupal.ajax.prototype.commands.invoke() + * defined in misc/ajax.js. + * + * @param $selector + * A jQuery selector string. If the command is a response to a request from + * an #ajax form element then this value can be NULL. + * @param $method + * The jQuery method to invoke. + * @param $arguments + * (optional) A list of arguments to the jQuery $method, if any. + * + * @return + * An array suitable for use with the ajax_render() function. + */ +function ajax_command_invoke($selector, $method, array $arguments = array()) { + return array( + 'command' => 'invoke', + 'selector' => $selector, + 'method' => $method, + 'arguments' => $arguments, + ); +} + /** * Creates a Drupal AJAX 'restripe' command. * diff --git a/misc/ajax.js b/misc/ajax.js index 127dd07ae95695b531bd31a894bb3550391d4ab8..088d46df7232fc644f71a7ad2e1d5976158f8a34 100644 --- a/misc/ajax.js +++ b/misc/ajax.js @@ -543,6 +543,14 @@ Drupal.ajax.prototype.commands = { $(response.selector).data(response.name, response.value); }, + /** + * Command to apply a jQuery method. + */ + invoke: function (ajax, response, status) { + var $element = $(response.selector); + $element[response.method].apply($element, response.arguments); + }, + /** * Command to restripe a table. */ diff --git a/modules/simpletest/tests/ajax.test b/modules/simpletest/tests/ajax.test index 2788d4f90b77b9e36508b1540e8ae7529fc08e56..2a2469334d39c7bbf590f94ea22ee08d94324dbc 100644 --- a/modules/simpletest/tests/ajax.test +++ b/modules/simpletest/tests/ajax.test @@ -211,6 +211,15 @@ class AJAXCommandsTestCase extends AJAXTestCase { ); $this->assertCommand($commands, $expected, "'data' AJAX command issued with correct key and value"); + // Tests the 'invoke' command. + $commands = $this->drupalPostAJAX($form_path, $edit, array('op' => t("AJAX invoke command: Invoke addClass() method."))); + $expected = array( + 'command' => 'invoke', + 'method' => 'addClass', + 'arguments' => array('error'), + ); + $this->assertCommand($commands, $expected, "'invoke' AJAX command issued with correct method and argument"); + // Tests the 'html' command. $commands = $this->drupalPostAJAX($form_path, $edit, array('op' => t("AJAX html: Replace the HTML in a selector."))); $expected = array( diff --git a/modules/simpletest/tests/ajax_forms_test.module b/modules/simpletest/tests/ajax_forms_test.module index 531c703fda68a6e4bb17f229b873b90f17ba68ae..21784dfa353c4b94c5bd5f6e02b0e78879cf540b 100644 --- a/modules/simpletest/tests/ajax_forms_test.module +++ b/modules/simpletest/tests/ajax_forms_test.module @@ -176,6 +176,16 @@ function ajax_forms_test_ajax_commands_form($form, &$form_state) { '#suffix' => '<div id="data_div">Data attached to this div.</div>', ); + // Shows the AJAX 'invoke' command. + $form['invoke_command_example'] = array( + '#value' => t("AJAX invoke command: Invoke addClass() method."), + '#type' => 'submit', + '#ajax' => array( + 'callback' => 'ajax_forms_test_advanced_commands_invoke_callback', + ), + '#suffix' => '<div id="invoke_div">Original contents</div>', + ); + // Shows the AJAX 'html' command. $form['html_command_example'] = array( '#value' => t("AJAX html: Replace the HTML in a selector."), @@ -331,6 +341,15 @@ function ajax_forms_test_advanced_commands_data_callback($form, $form_state) { return array('#type' => 'ajax', '#commands' => $commands); } +/** + * AJAX callback for 'invoke'. + */ +function ajax_forms_test_advanced_commands_invoke_callback($form, $form_state) { + $commands = array(); + $commands[] = ajax_command_invoke('#invoke_div', 'addClass', array('error')); + return array('#type' => 'ajax', '#commands' => $commands); +} + /** * AJAX callback for 'html'. */