2010-11-08 34 views
0

J'utilise du code JavaScript de http://snippets.dzone.com/posts/show/4973 et la suggestion scrollTop ci-dessous, pour créer un bookmarklet permettant d'insérer une chaîne de texte prédéfinie dans le nouveau message de Blogger textarea. Le code ressemble à ceci:scrollTop Sortir plutôt que de définir?

//IE support 
if (document.selection) { 
    myField.focus(); 

    //in effect we are creating a text range with zero 
    //length at the cursor location and replacing it 
    //with myValue 
    sel = document.selection.createRange(); 
    sel.text = myValue; 

//Mozilla/Firefox/Netscape 7+ support 
} else if (myField.selectionStart || myField.selectionStart == '0') { 

    myField.focus(); 
    //Here we get the start and end points of the 
    //selection. Then we create substrings up to the 
    //start of the selection and from the end point 
    //of the selection to the end of the field value. 
    //Then we concatenate the first substring, myValue, 
    //and the second substring to get the new value. 
    var startPos = myField.selectionStart; 
    var endPos = myField.selectionEnd; 
    myField.value = myField.value.substring(0, startPos) + myValue + myField.value.substring(endPos, myField.value.length); 
    myField.setSelectionRange(endPos+myValue.length, endPos+myValue.length); 
} else { 
    myField.value += myValue; 
} 

}

Et la suggestion ci-dessous:

//add this to the start of function 
textAreaScrollPosition = myField.scrollTop; 

//add this to end of the function 
myField.scrollTop = textAreaScrollPosition; 

La suggestion scrollTop échoue dans Firefox, remplaçant à la place de la page en cours dans le navigateur avec la valeur de textAreaScrollPosition.

Je a ajouté à l'avant de la version prise en sandwich vers le bas pour le bookmarklet:

javascript:var myField=document.getElementById('postingHtmlBox');var myValue='lol'; 

Au total, il lit:

javascript:var myField=document.getElementById('postingHtmlBox'); 
var myValue='lol'; 
var textAreaScrollPosition=myField.scrollTop; 
if(document.selection){myField.focus(); 
sel=document.selection.createRange(); 
sel.text=myValue; 
}else if(myField.selectionStart||myField.selectionStart=='0'){myField.focus(); 
var startPos=myField.selectionStart; 
var endPos=myField.selectionEnd; 
myField.value=myField.value.substring(0,startPos)+myValue+myField.value.substring(endPos,myField.value.length); 
myField.setSelectionRange(endPos+myValue.length,endPos+myValue.length); 
}else{myField.value+=myValue; 
}myField.scrollTop=textAreaScrollPosition; 

Sans sauts de ligne, cependant.

Je suis moins qu'un assistant JS. J'essaie juste d'aider un ami non-tech à faire quelque chose de complexe avec Blogger. Des idées?

EDIT: En plus d'ajouter la détection de la page primitive et de remplacer le texte prédéfini avec une boîte rapide, j'ai pu résoudre le problème d'origine en ajoutant myField.focus(); à la fin:

javascript:if(document.getElementById('postingHtmlBox')){var myField=document.getElementById('postingHtmlBox'); 
var myValue=prompt('Insert text here.'); 
var textAreaScrollPosition=myField.scrollTop; 
if(document.selection){myField.focus(); 
sel=document.selection.createRange(); 
sel.text=myValue; 
}else if(myField.selectionStart||myField.selectionStart=='0'){myField.focus(); 
var startPos=myField.selectionStart; 
var endPos=myField.selectionEnd; 
myField.value=myField.value.substring(0,startPos)+myValue+myField.value.substring(endPos,myField.value.length); 
myField.setSelectionRange(endPos+myValue.length,endPos+myValue.length); 
}else{myField.value+=myValue; 
}myField.scrollTop=textAreaScrollPosition; 
myField.focus(); 
}; 

Je ne sais pas si ce dernier point-virgule est strictement nécessaire ou pas, mais bon, des solutions!

Répondre

0

Selon la question éditée, l'ajout de myField.focus(); à la fin a résolu le problème.

0

Il se peut que votre bookmarklet soit trop long pour tenir dans un signet. Une option est d'utiliser une balise de script dynamique:

javascript:document.body.appendChild(document.createElement('script')).setAttribute('src','http://mysite/myscript.js') 

Où MyScript.js est le script réel qui fait le travail.

Si vous le conservez comme un marque-page autonome, assurez-vous d'entourer le tout (après "javascript:") avec des accolades.

+0

Un conseil: à des fins de développement, remplacez l'URL de script "http: //...whatever.js" par "http: //...whatever.js?" + Math.random() ... Comme cela, vous obtiendrez toujours la dernière version du fichier. Vous constaterez que cela facilite grandement le développement de bookmarklets, car vous n'avez pas toujours besoin d'éditer le signet lui-même, il suffit d'éditer un fichier sur un serveur web. Si, lorsque vous avez terminé, vous pouvez compacter la chose dans un signet autonome, cool, sinon, s'en tenir à la version hébergée. – rob

+0

Merci, rob. Je n'étais pas au courant de cette méthode jusqu'à maintenant. J'ai essayé de tester la longueur en réduisant le bookmarklet à ceci: ... javascript: var myField = document.getElementById ('postingHtmlBox'); var textAreaScrollPosition = monField.scrollTop; myField.scrollTop = textAreaScrollPosition; ... Malheureusement, la même erreur se produit. – CartoonChess

+0

Édité ma réponse ci-dessus. Le manque d'accolades semble être le problème ... Je pense que c'est nécessaire si vous déclarez des variables dans un bookmarklet. – rob