Come fare in modo che Google comprenda i collegamenti che attivano Javascript?
-
05-07-2019 - |
Domanda
Sto sviluppando un sito web che aiuti le persone a comprendere i testi rap.Gli utenti vedono il testo di una canzone rap e possono fare clic su determinati testi per vedere una spiegazione:
(clicca qui per saperne di più)
Come puoi vedere, ogni spiegazione ha un permalink (in questo caso http://RapExegesis.com/2636).Ecco cosa succede quando visiti uno di questi permalink nel tuo browser:
- L'app cerca il brano e l'artista corretti e ti reindirizza a http://rapexegesis.com/lyrics/ARTIST/SONG#note-2633 (in questo caso http://rapexegesis.com/lyrics/Jay-z/Empire-state-of-mind#note-2636)
- Quando viene caricata la pagina di un brano, l'app controlla se è presente una "nota-\d+" nel frammento dell'URL
- Se c'è, apre automaticamente la spiegazione corretta e la scorre per visualizzarla
Idealmente Google e altri motori di ricerca assocerebbero questi permalink alle relative spiegazioni.Tuttavia, poiché Google non capisce Javascript, questi due URL gli sembrano esattamente uguali:
- http://rapexegesis.com/lyrics/Jay-z/Empire-state-of-mind#note-2636
- http://rapexegesis.com/lyrics/Jay-z/Empire-state-of-mind
E quindi, http://rapexegesis.com/lyrics/Jay-z/Empire-state-of-mind sembra esattamente lo stesso di http://RapExegesis.com/2636 anche a Google.
Ovviamente questo non è l'ideale.qualche idea?Idealmente mi piacerebbe mostrare ai motori di ricerca una versione diversa di http://RapExegesis.com/2636 -- qualcosa di simile a
Lirica:Trovami in cucina come un Simmons che monta la pasta frolla
Senso:"In cucina" si riferisce alla cottura del crack (cfr. Qui, Qui, E Qui)
Vanessa e Angela Simmons, le figlie ventenni del reverendo Run of Run DMC, correre Pasticcino, marchio di abbigliamento e scarpe
MODIFICARE: Il modo in cui inizialmente avevo posto la domanda era un po’ confuso.Ci sono due questioni separate:
- Come funzionano i collegamenti alle spiegazioni sulle pagine delle canzoni?
- Come funzionano gli URL corrispondenti alle spiegazioni autonome?
Questo diagramma (a grandezza naturale qui) dovrebbe rendere le cose un po' più chiare:
Soluzione
Ecco una buona soluzione ... basata sull'esame delle descrizioni / dei diagrammi e sull'esame di questi per i siti Web precedenti.
Due concetti chiave da ricordare ... e il resto sono tutti i dettagli:
- Non mostrare a Google cose che non stai mostrando agli utenti normali. Fare qualcosa di difficile qui può metterti in grossi guai con loro e non è comunque necessario.
- Utilizza Progressive Enhancement per offrire ai tuoi utenti JavaScript un'esperienza migliore
Questo può essere fatto in questo modo ...
Nella pagina dei tuoi testi, crea un collegamento permanente ad ogni spiegazione come questa:
<a href="/lyrics/ARTIST/SONG?note=NOTEID" onclick="showPopUpExplanation(NOTEID);">lyric snippet here</a>
Nota come stiamo utilizzando un QueryString (?) invece di un hash (#) in modo che Google (e gli utenti con disabilitazione di JS) lo trattino come un vero e unico URL permalink.
Ora usa Progressive Enhancement e aggiungi onclick
gestori a tutti i tuoi .explanation-link
link (come mostrato sopra o come @Dean suggerito ), per far funzionare i popup inpage.
Non è necessario utilizzare i collegamenti # (hash) per i tuoi utenti JavaScript. Questo è necessario solo quando stai cercando di consentire al pulsante Indietro del browser di funzionare con AJAX, ma poiché stai mostrando un popup in-page (presumibilmente con un pulsante & Quot; chiudi & Quot;), questo non è affatto necessario.
Gli utenti che desiderano condividere una spiegazione specifica con i loro amici useranno il tuo breve URL (/NOTEID
). Questi URL abbreviati dovrebbero essere un reindirizzamento 301 al tuo vero permalink (quindi i motori di ricerca non indicizzano entrambi gli URL).
Infine, per far funzionare i permalink utilizzerai un piccolo scripting lato server in modo che visitando quella pagina mostrerai subito il popup . Fai qualcosa del genere:
<?php if (isset($_GET['note'])): ?>
<!-- place above the song lyrics; use CSS to style nicely for non-JS -->
<div id="explanation">
<?php printExplanation((int)$_GET['note']); ?>
</div>
<script type="text/javascript">
$('#explanation').hide(); // hide HTML explanation for JS users
showPopUpExplanationFromDiv($('#explanation'));
</script>
<?php endif; ?>
La parte importante qui è che stai stampando la spiegazione in HTML , piuttosto che in JavaScript / JSON in modo che gli utenti Google e non JS possano vederlo, ma migliorino progressivamente per gli utenti JS .
Altri suggerimenti
Non usare #, usa la stringa di query.
Quindi, invece di http://rapexegesis.com/lyrics/ARTIST/SONG # note-2633 , http://rapexegesis.com/ testi / artista / canzone? notare = 2633
il # è pensato specificamente per far parte della stessa pagina, usarlo per qualcos'altro non è giusto. Come ho capito dalla tua domanda, ciò raggiungerebbe ciò che desideri.
Perché non utilizzare un URL REST, simile a quello utilizzato in questo sito (guarda la barra degli indirizzi). In questo modo ogni collegamento è diverso e andrà in un posto corretto. Funzionerà anche se JavaScript è disabilitato, poiché il tuo server può elaborare l'URL.
Se hai javascript funzionante, tutto può essere fatto senza un aggiornamento della pagina, ma questo copre la base che lo spider di Google non esegue javascript.
È possibile modificare il collegamento per andare effettivamente a una pagina separata con il contenuto e modificare il comportamento del JavaScript per annullare l'azione predefinita di quel collegamento (restituire false) e caricare le cose come sono adesso.
In questo modo:
<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript">
jQuery(document).ready(function() {
$('.javascript-link').click(function(){
alert('usual behavior');
return false;
});
});
</script>
</head>
<body>
<a class="javascript-link" href="somewhere.html">click me</a>
</body>
</html>
Dovresti solo renderlo disponibile in entrambi i modi:
- i tuoi link in HTML bare bones sembrano http : //rapexegesis.com/lyrics/Jay-z/Empire-state-of-mind/note-2636 e il tintinnio su di essi ti porta a un'altra pagina che mostra solo la descrizione del comando in puro HTML
- quando JS è attivato, alcuni codici js scansionano tutti i collegamenti e li trasformano in http://rapexegesis.com/lyrics/Jay-z/Empire-state-of-mind#note-2636 .
In questo modo, il tuo codice sarà più accessibile (anche i non vedenti e adorano la musica, possono leggere il tuo sito Web). Poiché Google è l'utente web cieco più famoso della parola, lo capirà anche.
Sembra Google vuole fare la cosa giusta.La verità è che odio davvero la soluzione proposta.Tuttavia, sembra che potrebbero interpretare qualsiasi frammento di stato che inizia con un punto esclamativo come con stato, e quindi dovrebbero trattarlo come unico.
http://rapexegesis.com/lyrics/Jay-z/Empire-state-of-mind#note-2636
diventa
http://rapexegesis.com/lyrics/Jay-z/Empire-state-of-mind#!note-2636
Mantengo a biblioteca per gestire questo tipo di stato, e se, in effetti, lo stanno già implementando nei loro spider, allora aggiungerò io stesso il supporto per questo.
Utilizza un servizio di accorciamento url come Servizio di abbreviazione URL Bit.ly . (Devi digitare l'URL a cui desideri che sia diretto). Questo reindirizzerà Google all'URL. Non l'ho provato, quindi non sono sicuro che funzionerà.
MODIFICA: Hmm ... Stackoverflow.com utilizza il # nell'URL e lo fa indicizzare da Google, forse potresti chiedere loro ...? : D
Ok, quindi la situazione, per quanto ho capito, è quella per ogni permalink:
- Google deve ricevere codice HTML statico che corrisponde solo al testo specifico in questione.
- L'utente deve vedere l'intero brano, con il testo evidenziato.
Una soluzione per te: browser-sniff sul server. Invia a Google lo snippet e invia all'utente l'intera pagina. Con ASP.NET, è possibile utilizzare Server.Transfer su & Quot; reindirizzare & Quot; l'utente senza reindirizzarli effettivamente nel browser e senza AJAX.
<%@ Page Language="C#" %>
<script runat="server">
private void Page_Load(object sender, System.EventArgs e) {
if(!Request.Browser.Crawler) {
// look up the realUrl for the entire song
Server.Transfer(realUrl);
}
}
</script>
snippet for the specific lyric goes here and Google sees it, but users won't.