/** * * @link http://docs.jquery.com/Utilities/jQuery.map */ public static function map($array, $callback, $param1 = null, $param2 = null, $param3 = null) { $result = array(); $paramStructure = null; if (func_num_args() > 2) { $paramStructure = func_get_args(); $paramStructure = array_slice($paramStructure, 2); } foreach ($array as $v) { $vv = phpQuery::callbackRun($callback, array($v), $paramStructure); // $callbackArgs = $args; // foreach($args as $i => $arg) { // $callbackArgs[$i] = $arg instanceof CallbackParam // ? $v // : $arg; // } // $vv = call_user_func_array($callback, $callbackArgs); if (is_array($vv)) { foreach ($vv as $vvv) { $result[] = $vvv; } } else { if ($vv !== null) { $result[] = $vv; } } } return $result; }
/** * Trigger a type of event on every matched element. * * @param DOMNode|PhpQueryObject|string $document * @param unknown_type $type * @param unknown_type $data * * @TODO exclusive events (with !) * @TODO global events (test) * @TODO support more than event in $type (space-separated) */ public static function trigger($document, $type, $data = array(), $node = null) { // trigger: function(type, data, elem, donative, extra) { $documentID = phpQuery::getDocumentID($document); $namespace = null; if (strpos($type, '.') !== false) { list($name, $namespace) = explode('.', $type); } else { $name = $type; } if (!$node) { if (self::issetGlobal($documentID, $type)) { $pq = phpQuery::getDocument($documentID); // TODO check add($pq->document) $pq->find('*')->add($pq->document)->trigger($type, $data); } } else { if (isset($data[0]) && $data[0] instanceof DOMEvent) { $event = $data[0]; $event->relatedTarget = $event->target; $event->target = $node; $data = array_slice($data, 1); } else { $event = new DOMEvent(array('type' => $type, 'target' => $node, 'timeStamp' => time())); } $i = 0; while ($node) { // TODO whois phpQuery::debug("Triggering " . ($i ? "bubbled " : '') . "event '{$type}' on " . "node \n"); //.PhpQueryObject::whois($node)."\n"); $event->currentTarget = $node; $eventNode = self::getNode($documentID, $node); if (isset($eventNode->eventHandlers)) { foreach ($eventNode->eventHandlers as $eventType => $handlers) { $eventNamespace = null; if (strpos($type, '.') !== false) { list($eventName, $eventNamespace) = explode('.', $eventType); } else { $eventName = $eventType; } if ($name != $eventName) { continue; } if ($namespace && $eventNamespace && $namespace != $eventNamespace) { continue; } foreach ($handlers as $handler) { phpQuery::debug("Calling event handler\n"); $event->data = $handler['data'] ? $handler['data'] : null; $params = array_merge(array($event), $data); $return = phpQuery::callbackRun($handler['callback'], $params); if ($return === false) { $event->bubbles = false; } } } } // to bubble or not to bubble... if (!$event->bubbles) { break; } $node = $node->parentNode; $i++; } } }
/** * Run callback on actual object. * * @return PhpQueryObject|QueryTemplatesSource|QueryTemplatesParse|QueryTemplatesSourceQuery */ public function callback($callback, $param1 = null, $param2 = null, $param3 = null) { $params = func_get_args(); $params[0] = $this; phpQuery::callbackRun($callback, $params); return $this; }