¿Es posible con JavaScript encontrar una cadena de texto dada en una página web y luego calcular su distancia (en píxeles) desde la parte superior de la página? Si es así, un ejemplo sería apreciado.Seleccionar texto y luego calcular su distancia desde arriba con Javascript?
Respuesta
actualización: hecho más robusto.
Una demostración divertida e interactiva: Véalo en acción, here.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html>
<head>
<title>Word Finder Fun</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css">
body {
font-size: 16px;
font-weight: normal;
font-family: "Trebuchet MS", Helvetica, Tahoma, Arial, sans-serif;
padding: 10px 5%;
line-height: 1.5;
min-width: 680px;
}
table {
border: 1px solid black;
border-collapse: collapse;
margin: 1em;
}
th, td {
margin: 0px;
padding: 0.5ex;
border: 1px solid black;
}
td {
min-width: 8em;
}
th {
font-weight: bold;
background: wheat;
text-align: right;
}
caption {
margin: 0;
font-size: 1.2em;
font-style: italic;
text-align: left;
caption-side: top;
}
form {
float: left;
margin: 2.5em 5em;
}
label {
font-weight: bold;
background: yellow;
}
input {
padding: 0.5ex;
}
.FoundText {
background: red;
margin: 0;
padding: 0;
}
</style>
<!-- jQuery is required. -->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
function jQueryMain()
{
$("#idSearchStr").focus(); //-- User convenience, set focus to search input.
$("button").click (SearchPageText); //-- On button click, search away.
$("#idForm1").submit (SearchPageText); //-- Intercept form submit (enter key too).
}
function SearchPageText (zEvent)
{
/*--- Kill any old spans (otherwise they might interfere with new search).
*/
var NastyOldSpans = $("span.FoundText");
NastyOldSpans.each (function() {var X = $(this); X.before (X[0].innerHTML); });
NastyOldSpans.remove();
var SearchStr = $("#idSearchStr")[0].value;
//--- Ignore empty or trivial searches.
if (!SearchStr || /^\s+$/.test (SearchStr))
return false;
var zAllnodes = $("body *");
var iNumNodes = zAllnodes.length;
var zRegEx = new RegExp ('(' + SearchStr + ')', 'ig');
var bFoundOne = false;
/*--- Look for string and wrap it in a span if found.
*/
for (J=0; J < iNumNodes; J++)
{
/*-- Get node text in a way that supports both IE and Decent browsers.
We do NOT want to use innerHTML here. We do not want to mess
with matches in HTML tags, for now.
*/
var zNode = $(zAllnodes[J]);
var sNodeTxt = (zAllnodes[J]).innerText || (zAllnodes[J]).textContent;
if (zRegEx.test (sNodeTxt))
{
var OldStr = (zAllnodes[J]).innerHTML;
var NewStr = OldStr.replace (zRegEx, '<span class="FoundText">$1<\/span>');
//--- We want only "leaf" nodes (contain no html). So, if we detect a tag, skip.
if (/[<>]/.test (OldStr))
continue;
//--- SET with innerHTML, so that new span will take.
(zAllnodes[J]).innerHTML = NewStr;
bFoundOne = true;
}
}
/*--- Grab the string's particulars and update the status table.
*/
var iNumMatchChars = 0;
var iTop = 'na';
var iLeft = 'na';
if (bFoundOne)
{
iNumMatchChars = SearchStr.length;
var aStrPosition = $("span.FoundText:first").offset();
iTop = aStrPosition.top;
iLeft = aStrPosition.left;
}
var zStatusTable = $("#idStatTable")[0];
zStatusTable.rows[0].cells[1].innerHTML = iTop;
zStatusTable.rows[1].cells[1].innerHTML = iLeft;
zStatusTable.rows[2].cells[1].innerHTML = iNumMatchChars;
return false; //-- Stop form submit
}
$(document).ready (jQueryMain);
</script>
</head>
<body>
<form id="idForm1" method="post" action="">
<p>
<label for="idSearchStr">Enter Search String: </label><input type="text" id="idSearchStr"><br>
<button type="button">Find in page</button>
</p>
</form>
<table id="idStatTable" summary="Search match results">
<caption>First Match:</caption>
<tr>
<th>Top:</th>
<td></td>
</tr>
<tr>
<th>Left:</th>
<td></td>
</tr>
<tr>
<th>Char cnt:</th>
<td></td>
</tr>
</table>
<p>
I never spend much time in school but I taught ladies plenty. It's true I hire my body out
for pay, hey hey. I've gotten burned over Cheryl Tiegs, blown up for Raquel Welch. But when
I end up in the hay it's only hay, hey hey. I might jump an open drawbridge, or Tarzan from
a vine. 'Cause I'm the unknown stuntman that makes Eastwood look so fine.
</p>
<p>
Hey there where ya goin', not exactly knowin', who says you have to call just one place
home. He's goin' everywhere, B.J. McKay and his best friend Bear. He just keeps on movin',
ladies keep improvin', every day is better than the last. New dreams and better scenes, and
best of all I don't pay property tax. Rollin' down to Dallas, who's providin' my palace, off
to New Orleans or who knows where. Places new and ladies, too, I'm B.J. McKay and this is my
best friend Bear.
</p>
<p>
Top Cat! The most effectual Top Cat! Who's intellectual close friends get to call him T.C.,
providing it's with dignity. Top Cat! The indisputable leader of the gang. He's the boss,
he's a pip, he's the championship. He's the most tip top, Top Cat.
</p>
<p>
This is my boss, Jonathan Hart, a self-made millionaire, he's quite a guy. This is Mrs H.,
she's gorgeous, she's one lady who knows how to take care of herself. By the way, my name is
Max. I take care of both of them, which ain't easy, 'cause when they met it was MURDER!
</p>
<p>
Mutley, you snickering, floppy eared hound. When courage is needed, you're never around.
Those medals you wear on your moth-eaten chest should be there for bungling at which you are
best. So, stop that pigeon, stop that pigeon, stop that pigeon, stop that pigeon, stop that
pigeon, stop that pigeon, stop that pigeon. Howwww! Nab him, jab him, tab him, grab him,
stop that pigeon now.
</p>
</body>
</html>
esta es una idea divertida. de todos modos, construí una mini-clase en mootools que funciona de alguna manera. Todavía tengo que probarlo en un diseño de página más complejo, pero la premisa es encontrar todos los elementos con innerHTML que puedan ser útiles, escanear el texto buscando una coincidencia, si se encuentra, clonar el elemento padre mientras se reemplaza el texto con un lapso, luego recuperar los desplazamientos del tramo desde la parte superior/izquierda, etc. esto NO modificará el HTML del elemento existente y es escalable.
el resultado está aquí: http://www.jsfiddle.net/dimitar/eBPFb/
y la fuente es la siguiente:
var getTextOffset = new Class({
Implements: [Options],
options: {
selector: "*", // all elements
filter: "innerHTML", // only those that have this property are worth lookign at
skip: ["link", "style", "script","head","html","meta","input","textarea","select","body"] // useless tags we don't care about
},
initialize: function(text, options) {
this.setOptions(options);
if (!text) return; // nothing to do.
this.elements = document.getElements(this.options.selector).filter(function(el) {
return this.options.filter in el && !this.options.skip.contains(el.get("tag"));
}, this);
if (!this.elements.length)
return;
return this.findText(text);
},
findText: function(text) {
var coords = false;
this.elements.some(function(el) {
var eltext = el.get("html");
if (eltext.contains(text)) {
var c = el.getCoordinates();
var clone = new Element("div", {
"class": "clone",
styles: c,
html: eltext.replace(text, "<span id='posText'>"+text+"</span>")
}).inject(document.body, "top");
coords = document.id("posText").getCoordinates();
clone.destroy();
}
});
return coords;
}
});
var pleistoscene = new getTextOffset("Pleistocene");
if (pleistoscene) // found text so highlight it
new Element("div", {
styles: $merge(pleistoscene, {
position: "absolute",
background: "yellow"
}),
opacity: .7,
title: pleistoscene.top + "px top"
}).inject(document.body); // mouseover the yelow element to see offset (pleitoscene.top)
esperanza que esto tiene sentido - es duro, pero debe darle algunas ideas. si usa una selección para esto mediante el mouse, se vuelve mucho más fácil que la búsqueda. también, tenga en cuenta que esto busca html, por lo tanto, hacer un find para a very good year
con marcado de a very <a href=''>good</a> year
fallará (puede consultar propiedades de texto en su lugar).
está usando array.some() que detendrá el bucle después de la primera coincidencia. si quieres encontrar múltiples instancias, necesitas refactorizar.
buena suerte
Parece que no funciona en una página HTML real. – user379588
Se busca en todo el cuerpo de una cadena, se suma una clase de encontradas y alerta a las coordenadas de cada elemento.
Desafortunadamente no vi la otra publicación, pero esta es un poco más corta.
$(document).ready(function() {
findText("commodo");
});
function findText(text) {
var $matchedEl = $('body:contains(' + text + ')');
var replacedText;
var re = new RegExp(text, 'ig');
$matchedEl.each(function() {
replacedText = $(this).html().replace(re, '<span class="found">' + text + '</span>');
$(this).html(replacedText);
});
$("span.found").each(function() {
var offset = $(this).offset();
alert("top: " + offset.top + "\n left: " + offset.left);
});
}
y algo de texto lipsum para buscar
<div id="wrapper">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum tincidunt cursus tortor, ut mollis nulla commodo non. Quisque libero mauris, ullamcorper a porttitor nec, blandit eu sem. Vestibulum ac libero mauris, in tincidunt sem. Sed aliquet porta neque ut scelerisque. Aliquam nec aliquam ligula. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse potenti. Duis ut molestie ante. </p>
<p>Vestibulum ac odio id tortor interdum pharetra sit amet at nunc. Praesent pellentesque justo non massa vulputate vitae consectetur augue venenatis. Cras semper nulla tincidunt dolor sagittis sodales. Aenean malesuada eleifend enim nec accumsan. Morbi ut neque metus. Aenean erat ligula, sagittis vel scelerisque et, placerat vel diam. Nunc hendrerit quam at turpis ultrices imperdiet. Suspendisse sit amet mi sed enim ultrices consectetur. Quisque eu lobortis massa. </p>
<p>Nulla cursus, metus ut consequat adipiscing, elit nisi semper mi, at commodo orci sapien ullamcorper lorem. Quisque scelerisque felis ut felis ultrices pellentesque. </p>
</div>
Gracias por el código, sin embargo, cuando ejecuto una prueba en FireFox, en una página con más contenido, está desactivado en alrededor de 60-80 píxeles. – user379588
Supongo que está midiendo desde la coordenada superior/izquierda. Podría tener una jugada y ver qué está pasando ... ¿O ya has encontrado una solución? – Marko
Del texto seleccionado a la parte superior. – user379588
- 1. ¿Cómo seleccionar texto de RichTextBox y luego colorearlo?
- 2. Seleccionar texto en javascript
- 3. ¿Cómo calcular la distancia desde un archivo GPX?
- 4. Calcular distancia geográfica en elasticsearch
- 5. GPS V.S. acelerómetro para calcular la distancia
- 6. ¿Detecta la distancia del elemento HTML desde arriba hacia la izquierda?
- 7. Necesita ayuda para calcular la distancia geográfica
- 8. Android distancia calcular entre dos ubicaciones
- 9. Javascript: redondee hacia arriba y hacia abajo al 5 más cercano, luego encuentre un denominador común
- 10. selección jQuery: atravesar hacia arriba, luego hacia abajo
- 11. calcular la distancia dados 2 puntos, latitud y longitud
- 12. Calcular un campo de distancia con signo 2D
- 13. cómo encontrar la distancia vertical desde arriba en px de un elemento usando jQuery
- 14. ¿Cómo se puede calcular la distancia euclidiana con numpy?
- 15. Calcular latitud y longitud teniendo metros de distancia desde otro punto de latitud/longitud
- 16. Calcular la distancia entre dos coordenadas x/y?
- 17. javascript seleccionar texto en textarea onload
- 18. distanceFromLocation - Calcular la distancia entre dos puntos
- 19. UITextField comienza el texto desde arriba cuando aumenta la altura
- 20. ¿Cómo seleccionar líneas de texto en un PDF y luego resaltarlas? (iOS)
- 21. TSQL SELECT luego ACTUALIZAR en una transacción, luego devolver SELECCIONAR
- 22. HTML5 Arrastrar y colocar: Cargar archivo de texto en un cuadro de texto con JavaScript
- 23. Seleccionar texto interno con jQuery
- 24. Dynamic SELECCIONAR ARRIBA @var En SQL Server
- 25. Agregar texto arriba Video HTML5
- 26. Voltear UIViews desde arriba/abajo
- 27. MySQL seleccionar y calcular el valor de varias columnas
- 28. MySQL Seleccionar desde: Seleccionar
- 29. ¿Cómo puedo seleccionar una pestaña de IE desde su identificador
- 30. Levenshtein Distancia en VBA
Esto está bien en la demo. Me sentí halagado de que brindes un buen ejemplo. Voy a probarlo en una página HTML básica. – user379588
@subwayxpress: Gracias. Tenga en cuenta que acabo de ajustarlo para garantizar que las etiquetas HTML no coincidan. –