2010-09-14 11 views
6

Estoy buscando crear un bookmarklet entre sitios que obtenga una palabra resaltada, lo pase a un método CodeIgniter (domain.com/controller/method) y devuelve la definición a través de una API de diccionario. Tengo un esqueleto que funciona bien en un solo dominio, pero estoy buscando expandirlo para usar el dominio cruzado JSONP. Pero no me siento claro.JSONP para orientación de marcador de sitios entre sitios

Sé que necesito cargar un script desde una ubicación remota e insertarlo en el contexto actual. Y creo que tendré que obtener la palabra resaltada en una página, luego llamar a una URL que se parece al domain.com/controller/method/word para obtener esa secuencia de comandos. Entonces se nubla.

Creo que esencialmente dos preguntas:

  • ¿Dónde incluyo el código JavaScript necesario para manejar el análisis y la aprobación de la palabra a través de XMLHTTPRequest? Creo que este será el SRC del guión que inyectaré en el nuevo contexto. ¿Esto de alguna manera está dentro de mi método CodeIgniter relevante? ¿O este nuevo script proviene de una ubicación aleatoria en el mismo servidor que el método relevante y simplemente lo llama?

Respuesta: Esto no es complementario del XMLHTTPRequest, esto es, en lugar de ella, de modo que el paso se elimina completamente. La nueva secuencia de comandos llama al método, pasa la información necesaria a través de cadenas de consulta y recibe la matriz JSON en respuesta.

  • ¿Tengo conocimiento correcto de que eventualmente pasaré la respuesta JSON del método de nuevo como word(json_encode($array));?

Respuesta: Sí, yo paso atrás como que callbackFunctionName(json_encode($array));.

actualización

que incluía las respuestas a dos de mis tres respuestas anteriores. Si alguien puede explicar las cosas a fondo, por supuesto que marcaré su respuesta como correcta, de lo contrario elaboraré mis obstáculos en una respuesta. Todavía no tengo idea donde escribo la función de devolución de llamada y lo que haré con eso en JS.

Muchas gracias por cualquier ayuda que pueda dar en esto.

Respuesta

7

primer set de su bookmarklet con un enlace que puede caer en la barra de marcadores:

<html> 
<head></head> 
<body> 
    <a href="javascript:(function(src, cb){var s = document.createElement('script');s.charset = 'UTF-8';document.body.insertBefore(s, document.body.firstChild);s.src = src;if(typeof cb === 'function'){s.onload = cb;s.onreadystatechange = function(){(/loaded|complete/).test(s.readyState)&&cb(s);};}return s;}('http://github.com/pure/pure/raw/master/libs/pure.js', function(e){alert('loaded');}))">load</a> 
</body> 
</html> 

Vuelva a colocar la url por su guión, se carga y se ejecuta en la página de acogida.

Sin embargo, ahora se encuentra en la página alojada y no puede llamar a su servidor con XMLHTTPRequest ya que los dominios no coinciden.
Aquí viene JSONP.

En el guión cargado, se puede poner una función, por ejemplo: function srvCallback(json){...}

Cuando se quiere llamar a su servidor va a inyectar como una secuencia de comandos con una función similar como en el bookmarklet arriba:

function jsonp(src){ 
    var s = document.createElement('script'); 
     old = document.getElementById('srvCall'); 
    old && document.body.removeChild(old); 
    s.charset = 'UTF-8'; 
    s.id = 'srvCall'; 
    document.body.insertBefore(s, document.body.firstChild); 
    s.src = src + '?' + new Date().getTime(); 
} 

Inyectar su solicitud, por ejemplo:

jsonp('http://domain.com/controller/method/word') 

El servidor debe responder algo como:

srvCallback({word:'hello'}); 

Y finalmente se llama automáticamente a la función srvCallback, dentro de la función obtiene su JSON y muestra el resultado al usuario.

+0

Hola Mic, estoy un poco confundido. Este es un bookmarklet del que estamos hablando, entonces, ¿cómo pondría cualquiera de los dos guiones en el cuerpo para empezar? Cualquier cosa que quiera usar, necesito inyectarla, ¿verdad? –

+0

Espero que esta segunda toma te ayude. – Mic

+0

¡Hola Mic, tu ayuda me ayudó! En mi bookmarklet, inyecté mi script secundario a través de una función autoejecutable, y en ese script secundario, incluí todos mis JS y una función autoejecutable para llamar a mi método, que devuelve el método ({jsonData}). Y en ese mismo script secundario, tengo una función llamada método (jsonp) que recibe y analiza los datos. La única pregunta que me queda es, ** ¿por qué la función de devolución de llamada en la inyección inicial? ** –

Cuestiones relacionadas