2010-06-29 16 views
13

Je travaille donc sur un bookmarklet où il serait idéal pour moi de saisir le contenu sélectionné par l'utilisateur en utilisant la "boucle". Les deux window.getSelection et document.getSelection sont des fonctions que je peux appeler, cependant, ils retournent toujours une chaîne vide.Utilisez JavaScript pour obtenir le texte sélectionné dans Mobile Safari

Je crois que le problème est que lorsque vous appuyez sur l'icône de signet dans Mobile Safari, la sélection est libérée. Par exemple, si vous sélectionnez du texte, appuyez sur le "+", le signet ou sur un autre onglet, la sélection n'est pas sélectionnée même si vous annulez.

Vous ne savez pas s'il est possible d'obtenir ces données? Ou est-ce à peu près impossible?

+0

Etes-vous sûr que window.getSelection() renvoie une chaîne vide, et non DOMSelection? Je n'ai pas accès à Mobile Safari, mais dans webkit cette fonction retourne DOMSelection même s'il n'y a rien de sélectionné sur la page. – SWilk

+0

voir aussi http://stackoverflow.com/questions/1936132/getselection-for-iphone-bookmarklet – cofiem

Répondre

1

Je pense que vous devriez avoir le bookmarklet insérer du contenu dans la page qui fonctionnerait sur la sélection. Vous pouvez ajouter un bouton en haut ou en bas de la page, et lorsque vous cliquez dessus, cela agit sur la sélection en cours. Il pourrait alors nettoyer le contenu ajouté ou le laisser là.

+0

C'est l'une des solutions auxquelles j'ai réfléchi après avoir posté cette question. Mon souci avec cette solution est que je ne peux pas penser à un bon moyen de positionner le "bouton" ajouté de sorte qu'il sera facilement sélectionnable. Mobile Safari ne prend pas en charge la propriété CSS "position: fixed". il ajoute également plusieurs étapes: 1) Activer signet 2) Sélectionner le texte 3) et activer le contenu Repérez ajouté du signet vs 1) Sélectionner le texte 2) Activer signet Merci pour votre suggestion. – Nirmal

+0

Vous pourriez vouloir prendre un métier à tisser au bookmarklet de http://amplify.com/ - ils font exactement ce qui est proposé ici et le bouton suit les actions de défilement. – FRotthowe

1

Le contenu de la "boucle" n'est pas exposé à javascript dans le navigateur mobile, point. Cela est impossible (je suppose que vous travaillez dans le navigateur complet, pas dans la fenêtre du navigateur créée lorsque vous lancez une icône "enregistré sur la page d'accueil")

+0

Votre message est un commentaire et non une réponse. Utilisez les commentaires lorsque vous posez une question et que vous ne publiez pas de solution. Sinon, ce n'est pas utile. – UpHelix

+0

C'est une réponse s'il travaille dans le navigateur natif. –

-1

J'ai une idée assez simple.

var latestSelection = ""; 
while (true) 
{ 
    var tmp; 
    if ((tmp = document.getSelection()) != "") 
     latestSelection = tmp; 
} 

De cette façon, vous avez toujours la dernière sélection dans la dernière variable de sélection. Bien sûr, il serait coûteux d'avoir une boucle comme ça tout le temps. Donc, vous voudrez probablement jouer avec les auditeurs ou au moins les timers.

Espérons que cela aide.

Mise à jour: N'utilisez pas le code ci-dessus tel quel.

Voici comment vous écrire la même chose objective-c:

- (void) updateSelection 
{ 
    NSString * tmp = [webView stringByEvaluatingJavaScriptFromString:@"document.getSelection()"]; 
    if (![tmp isEqualToString:@""]) 
     latestSelection = tmp; 
} 

Vous pourriez avoir une minuterie exécuter UpdateSelection toutes les unités de temps x. Si vous trouvez une bonne notification que vous savez que l'utilisateur a interagi avec le webview, vous pouvez l'utiliser pour mettre à jour latestSelection.

+0

Je pense que cela verrouillerait le thread de l'interface utilisateur, bien que changer pour utiliser setInterval() ou setTimeout() ne serait pas,;) –

+0

Quelqu'un peut-il expliquer pourquoi cette réponse a été rejetée? J'explique que vous devriez utiliser des timers ou des écouteurs, de sorte que vous ne verrouilliez pas le thread d'interface utilisateur. Aussi, si vous ne voulez pas l'écrire en Javascript, vous pouvez facilement écrire la même chose dans Objective-C. Le code expliquait juste une idée. Je ne disais pas que vous utiliseriez ce code. –

+0

Je ne vois pas pourquoi il a été voté. Ça m'a l'air utile. J'ai juste voté. Vous avez une idée du type d'auditeurs à utiliser? Les temporisateurs risquent de manquer des changements dans la sélection qui se produit entre la dernière coche de temporisation et l'exécution du bookmarklet. – LarsH