Array of images from flickr not showing in the intended order - javascript
I'd like to preface I'm a total beginner with JS, only been working with it for a few days now.
Here's what I'm working with http://jsfiddle.net/joyroyxw/
What I want to do is get a person's name and display images of each letter in their name.
So far I'm able to split the name into the individual letters, and concatenate "letter," as search tags, so that flickr returns images of each letter.
My problem is these images are not being added in order, could this be because one query loads faster than another? How could I add a buffer or delay so that each letter is displayed in order? Why would it do that if my for loop is sending the tags to the function in order?
Javascript from jsfiddle:
function getQueryStringVar(name){
var qs = window.location.search.slice(1);
var props = qs.split("&");
for (var i=0 ; i < props.length;i++){
var pair = props[i].split("=");
if(pair[0] === name) {
return decodeURIComponent(pair[1]);
}
}
}
function getLetterImage(tag){
var flickerAPI = "https://www.flickr.com/services/feeds/photos_public.gne?jsoncallback=?";
$.getJSON( flickerAPI, {
tags: tag,
tagmode: "all",
format: "json"
})
.done(function (flickrdata) {
//console.log(flickrdata);
var i = Math.floor(Math.random() * flickrdata.items.length);
var item = flickrdata.items[i];
var url = item.media.m;
console.log(url);
$("body").append("<img src="+ url + "></img>");
});
}
$(document).ready(function() {
var name = getQueryStringVar("name") || "Derek";
var str = "letter,";
var searchtags = new Array()
for (var i = 0; i < name.length; i++) {
//console.log(str.concat(searchtags.charAt(i)));
searchtags[i] = str.concat(name.charAt(i));
}
for (var j = 0; j < name.length; j++){
//getLetterImage(searchtags[j]);
getLetterImage(searchtags[j]);
}
});
Instead of using append, try having a place holder element already build to receive the data.
<div id="img1">Loading</div>
<div id="img2">Loading</div>
<div id="img3">Loading</div>
You can dynamically create the elements as needed with javascript. Then you populate them in the order. Simply increment i as you go.
$("#img"+i).html("<img src="+ url + "></img>");
UPDATE
Your jsfiddle was very close, but you have to remember that ajax is asynchronous.
html
<body>
<h1>Hi! What's your name?</h1>
<form action="trending.html">
<input class="textbox" type="text" name="name">
</form>
<div id="img0">Loading</div>
<div id="img1">Loading</div>
<div id="img2">Loading</div>
<div id="img3">Loading</div>
<div id="img4">Loading</div>
</body>
javascript
function getQueryStringVar(name){
var qs = window.location.search.slice(1);
var props = qs.split("&");
for (var i=0 ; i < props.length;i++){
var pair = props[i].split("=");
if(pair[0] === name) {
return decodeURIComponent(pair[1]);
}
}
}
function getLetterImage(tag, theNumber){
var flickerAPI = "https://www.flickr.com/services/feeds/photos_public.gne?jsoncallback=?";
return $.getJSON( flickerAPI, {
tags: tag,
tagmode: "all",
format: "json"
})
.then(function (flickrdata) {
//console.log(flickrdata);
var i = Math.floor(Math.random() * flickrdata.items.length);
var item = flickrdata.items[i];
var url = item.media.m;
$("#img"+theNumber).html("<img src="+ url + "></img>");
});
}
$(document).ready(function() {
var name = getQueryStringVar("name") || "Derek Martin";
var str = "letter,";
var searchtags = new Array()
for (var i = 0; i < name.length; i++) {
searchtags[i] = str.concat(name.charAt(i));
}
for (var j = 0; j < name.length; j++){
getLetterImage(searchtags[j], j);
}
});
Related
Nested loop only rendering last indexed item using jquery appendPe
Performing an ajax call to a drinks api and I've nested a loop to pull the ingredients out and render them to the page. The nested loop consoles the ingredients correctly but when I use jquery to append the results to the page only the item in the last index is displayed. I know there are null values I was going to remove them with an if statement after I got them to show. function displayDrinkData(drinkName) { var queryURL = "https://thecocktaildb.com/api/json/v1/1/search.php?s=" + drinkName $.ajax({ url: queryURL, method: "GET" }).then(function (response) { console.log(response); var results = response.drinks; for (var i = 0; i < results.length; i++) { console.log(results[i]); var eachDrink = results[i]; var drinkDiv = $("<div>"); var drinkName = results[i].strDrink; for (var k = 1; k < 16; k++) { console.log(eachDrink['strIngredient' + k]); var ingList = $("<ul>").text("Ingredients: " + eachDrink['strIngredient' + k]) } var pOne = $("<p>").text("Drink name: " + drinkName); var drinkInstructions = results[i].strInstructions; var pTwo = $("<p>").text("Instructions: " + drinkInstructions); var drinkImage = $("<img>"); drinkImage.attr("src", results[i].strDrinkThumb); drinkDiv.append(pOne); drinkDiv.append(ingList); drinkDiv.append(pTwo); drinkDiv.append(drinkImage); $("#drinks-view").append(drinkDiv); } }) }
Because var ingList is inside loop, not appending, but creating a new one every time. var ingList = $("<ul>"); for (var k = 1; k < 16; k++) { console.log(eachDrink['strIngredient' + k]); ingList.append($('<li>').text("Ingredients: " + eachDrink['strIngredient' + k])); } Declare variable outside loop, and append <li> for each element.
Replace string in text area with the value of ajax response
I have an ajax function that returns a shorturl of an url from a textarea. When I want to replace the shorturl by the actual url in the text area by using replace, the code not work. this is my implementation Ajax function: function checkUrl(text) { var bit_url = ""; var url = text; var username = "o_1i42ajamkg"; // bit.ly username var key = "R_359b9c5990a7488ba5e2b0ed541db820"; return $.ajax({ url: "http://api.bit.ly/v3/shorten", data: { longUrl: url, apiKey: key, login: username }, dataType: "jsonp", async: false, success: function(v) { bit_url = v.data.url; } }); } and a function that call the checkurl function is implemented as follow $("#urlr").change(function() { var text = $("#Pushtype_message").val(); var c = ""; var msgtext = ""; var urlRegex = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&##\/%?=~_|!:,.;]*[-A-Z0-9+&##\/%=~_|])/ig; var MsgStr = $("#Pushtype_message").val(); var Arr = text.split(" "); urllist = new Array(); urluri = new Array(); i = 0; for (var n = 0; n < Arr.length; n++) { txtStr = Arr[n]; var urltest = urlRegex.test(txtStr); if (urltest) { urllist[i] = txtStr; } } for (var i = 0; i < urllist.length; i++) { // console.log(urllist[i].toString()); checkUrl(urllist[i]).done(function(result) { var response = (result.data.url); console.log(response); MsgStr.replace(urllist[i], response); console.log(MsgStr); $("#Pushtype_message").val(MsgStr); }); } }); In my text area I put this text: test utl function https://www.google.Fr test success and I get in my console the following result main.js http://bit.**** main.js test utl function https://www.google.Fr test success As you see, the function return an urlshortner but the initial text still the same. My expected result is: test utl function http://bit.l**** test success, but this don't work.
When working with textarea you can simply replace their text. $("#Pushtype_message").text(MsgStr);
You need the assign the new value to MsgStr for(var i=0; i<urllist.length; i++){ // console.log(urllist[i].toString()); checkUrl(urllist[i]).done(function(result){ var response=(result.data.url); console.log(response); MsgStr = MsgStr.replace(urllist[i],response); console.log(MsgStr); $("#Pushtype_message").val(MsgStr); }); } i is defined outside your for loop and used inside it urllist[i]=txtStr; but its value is never assigned, it's alaways = 0: i=0; for (var n = 0; n < Arr.length; n++) { txtStr = Arr[n]; var urltest=urlRegex.test(txtStr); if(urltest) { urllist[i]=txtStr; } }
I found the solution about my problem, I affect urllist[j] to a new variable text, because in the checklist function urllist[j] return an undefined value. var j=0; for(j; j<urllist.length; j++){ var text=urllist[j]; checkUrl(urllist[j]).done(function(result){ var response=result.data.url; console.log(urllist[j]); MsgStr1 = MsgStr.replace(text,response); console.log(MsgStr1); $("#Pushtype_message").val(MsgStr1); }); } });
Spliting String and getting appropriate value in JavaScript
I have a string where |||| means next to it is the directory. ||| means the user is allowed to access this directory and || means the files allocated to these users follow. I need to find allocated file names of a specific user from this string. I have tried to split the string and assign values to an array but I am not able to get the result I'm looking for. This is the string: ||||Root|||adil001,km11285c,km61052,km61639c,adil001,kl04707c,km47389,km58184,km61052,kq61023c,adil001,km11285c,km61052,km61639c,||LimitTest_20140528164643.xlsx,testTask2_20140528140033.xlsx,||||1400842226669|||adil001,km11285c,km61052,km61639c,adil001,kl04707c,km47389,km58184,km61052,kq61023c,adil001,km11285c,km61052,km61639c,adil001,km11285c,km61052,km61639c,adil001,km11285c,km61052,km61639c,||LimitTest_20140528164643.xlsx,testTask2_20140528140033.xlsx,testTask1_20140528135944.xlsx,testTask2_20140528140033.xlsx,||||1401191909489|||adil001,km11285c,km61052,km61639c,adil001,kl04707c,km47389,km58184,km61052,kq61023c,adil001,km11285c,km61052,km61639c,adil001,km11285c,km61052,km61639c,adil001,km11285c,km61052,km61639c,adil001,km11285c,km61052,km61639c,adil001,kl04707c,km47389,km58184,km61052,kq61023c,||LimitTest_20140528164643.xlsx,testTask2_20140528140033.xlsx,testTask1_20140528135944.xlsx,testTask2_20140528140033.xlsx,LimitTest_20140528164643.xlsx, And here is my attempt: function getData() { var user = 'km11285c'; var value = "||||Root|||adil001,km11285c,km61052,km61639c,adil001,kl04707c,km47389,km58184,km61052,kq61023c,adil001,km11285c,km61052,km61639c,||LimitTest_20140528164643.xlsx,testTask2_20140528140033.xlsx,||||1400842226669|||adil001,km11285c,km61052,km61639c,adil001,kl04707c,km47389,km58184,km61052,kq61023c,adil001,km11285c,km61052,km61639c,adil001,km11285c,km61052,km61639c,adil001,km11285c,km61052,km61639c,||LimitTest_20140528164643.xlsx,testTask2_20140528140033.xlsx,testTask1_20140528135944.xlsx,testTask2_20140528140033.xlsx,||||1401191909489|||adil001,km11285c,km61052,km61639c,adil001,kl04707c,km47389,km58184,km61052,kq61023c,adil001,km11285c,km61052,km61639c,adil001,km11285c,km61052,km61639c,adil001,km11285c,km61052,km61639c,adil001,km11285c,km61052,km61639c,adil001,kl04707c,km47389,km58184,km61052,kq61023c,||LimitTest_20140528164643.xlsx,testTask2_20140528140033.xlsx,testTask1_20140528135944.xlsx,testTask2_20140528140033.xlsx,LimitTest_20140528164643.xlsx,"; var users = null; var files = null; var Dir = value.split("||||"); var arrayLength = Dir.length; for (var i = 0; i < arrayLength; i++) { users = Dir[i].split("|||"); } return users; } console.log(getData()); and the jsFiddle
I changed your jsfiddle example a bit so maybe you need to change the code here and there, but something like this should work: function buildTree(data) { var tree = []; var dirs = data.split("||||"); // Remove the first entry in the array, since it should be empty. dirs.splice(0, 1); for (var i = 0; i < dirs.length; ++i) { var tempArray = dirs[i].split("|||"); var dirName = tempArray[0]; var usersAndFiles = tempArray[1]; tempArray = usersAndFiles.split("||"); var users = tempArray[0]; var files = tempArray[1]; var treeDir = { name: dirName }; treeDir.users = users.split(","); treeDir.files = files.split(","); tree.push(treeDir); } return tree; } function getData() { var user = 'km11285c'; var value="||||Root|||adil001,km11285c,km61052,km61639c,adil001,kl04707c,km47389,km58184,km61052,kq61023c,adil001,km11285c,km61052,km61639c,||LimitTest_20140528164643.xlsx,testTask2_20140528140033.xlsx,||||1400842226669|||adil001,km11285c,km61052,km61639c,adil001,kl04707c,km47389,km58184,km61052,kq61023c,adil001,km11285c,km61052,km61639c,adil001,km11285c,km61052,km61639c,adil001,km11285c,km61052,km61639c,||LimitTest_20140528164643.xlsx,testTask2_20140528140033.xlsx,testTask1_20140528135944.xlsx,testTask2_20140528140033.xlsx,||||1401191909489|||adil001,km11285c,km61052,km61639c,adil001,kl04707c,km47389,km58184,km61052,kq61023c,adil001,km11285c,km61052,km61639c,adil001,km11285c,km61052,km61639c,adil001,km11285c,km61052,km61639c,adil001,km11285c,km61052,km61639c,adil001,kl04707c,km47389,km58184,km61052,kq61023c,||LimitTest_20140528164643.xlsx,testTask2_20140528140033.xlsx,testTask1_20140528135944.xlsx,testTask2_20140528140033.xlsx,LimitTest_20140528164643.xlsx,"; var tree = buildTree(value); for (var i = 0; i < tree.length; ++i) { var dir = tree[i]; if (dir.users.indexOf(user) >= 0) { console.log("User '" + user + "' has access to directory '" + dir.name + "', which contains these files: " + dir.files.join(",")); } } } getData();
Get anchor tag values in jQuery
I have a html tag like this. <a class="employee_details" target="_blank" href="index1.php?name=user1&id=123">User</a> I need to get the two parameter values in jquery <script type="text/javascript"> $(function () { $('.employee_details').click(function () { var status_id = $(this).attr('href').split('name'); alert(status_id[0]); }); }); </script> Any help in getting both the parameter values in two variables in javascript. I want to get user1 and 123 in two variables using jQuery Thanks Kimz
You can use URLSearchParams as a most up-to-date and modern solution: let href = $(this).attr('href'); let pars = new URLSearchParams(href.split("?")[1]); console.log(pars.get('name')); Supported in all modern browsers and no jQuery needed! Original answer: Try this logic: var href = $(this).attr('href'); var result = {}; var pars = href.split("?")[1].split("&"); for (var i = 0; i < pars.length; i++) { var tmp = pars[i].split("="); result[tmp[0]] = tmp[1]; } console.log(result); So you'll get the parameters as properties on result object, like: var name = result.name; var id = result.id; Fiddle. An implemented version: var getParams = function(href) { var result = {}; var pars = href.split("?")[1].split("&"); for (var i = 0; i < pars.length; i++) { var tmp = pars[i].split("="); result[tmp[0]] = tmp[1]; } return result; }; $('.employee_details').on('click', function (e) { var params = getParams($(this).attr("href")); console.log(params); e.preventDefault(); return false; }); Fiddle.
$(function() { $('.employee_details').on("click",function(e) { e.preventDefault(); // prevents default action var status_id = $(this).attr('href'); var reg = /name=(\w+).id=(\w+)/g; console.log(reg.exec(status_id)); // returns ["name=user1&id=123", "user1", "123"] }); }); // [0] returns `name=user1&id=123` // [1] returns `user1` // [2] returns `123` JSFiddle NOTE: Better to use ON method instead of click
Not the most cross browser solution, but probably one of the shortest: $('.employee_details').click(function() { var params = this.href.split('?').pop().split(/\?|&/).reduce(function(prev, curr) { var p = curr.split('='); prev[p[0]] = p[1]; return prev; }, {}); console.log(params); }); Output: Object {name: "user1", id: "123"} If you need IE7-8 support this solution will not work, as there is not Array.reduce.
$(function () { $('.employee_details').click(function () { var query = $(this).attr('href').split('?')[1]; var vars = query.split('&'); for (var i = 0; i < vars.length; i++) { var pair = vars[i].split('='); var varName = decodeURIComponent(pair[0]); var varValue = decodeURIComponent(pair[1]); if (varName == "name") { alert("name = " + varValue); } else if (varName == "id") { alert("id = " + varValue); } } }); });
It's not very elegant, but here it is! var results = new Array(); var ref_array = $(".employee_details").attr("href").split('?'); if(ref_array && ref_array.length > 1) { var query_array = ref_array[1].split('&'); if(query_array && query_array.length > 0) { for(var i = 0;i < query_array.length; i++) { results.push(query_array[i].split('=')[1]); } } } In results has the values. This should work for other kinds of url querys.
It's so simple // function to parse url string function getParam(url) { var vars = [],hash; var hashes = url.slice(url.indexOf('?') + 1).split('&'); for (var i = 0; i < hashes.length; i++) { hash = hashes[i].split('='); vars.push(hash[0]); vars[hash[0]] = hash[1]; } return vars; } // your code $(function () { $('.employee_details').click(function (e) { e.preventDefault(); var qs = getParam($(this).attr('href')); alert(qs["name"]);// user1 var status_id = $(this).attr('href').split('name'); }); });
passing page scraped data in the URL
In my Chrome extension, I'm trying to scrape information from the current tab (in content.js) and send it as parameter to the provided URL (background.js). It seems like I can scrape everything from the tab and append it to the URL except the values of input tags. Here's my code: content.js: var elements = new Array("form","h1","input","td","textarea","time","title","var"); //declare an array for found elements var foundElements = new Array(); //declare an array for found ids var foundIds = new Array(); //this counter is used to hold positions in the element array. var elementCounter = 0; //this counter is used to hold positions in the foundIds array var idsCounter = 0; //this counter is used to hold positions in the classCounter array. var classCounter = 0; //and we're going to output everything in a giantic string. var output = "URL=" + document.URL; //scrape the page for all elements for (var i = 0; i < elements.length; i++) { var current = document.getElementsByTagName(elements[i]); if(current.length>0) { for (var z=0; z<current.length; z++) { var inTxt = current[z].innerText; output += "&" + elements[i] + "=" + inTxt; } elementCounter++; //now that we have an array of a tag, check it for IDs and classes. for (var y = 0; y<current.length; y++) { //check to see if the element has an id if(current[y].id) { //these should be unique var hit = false; for (var x = 0; x<foundIds.length; x++) { if(foundIds[x]==current[y].id) { hit=true; } } //if there was no hit... if(!hit) { foundIds[idsCounter]=current[y].id; idsCounter++; var currVal = current[y].value; output+="&" + current[y].id + "=" + currVal; } } //now we pull the classes var classes = current[y].classList; if(classes.length>0) { for (var x = 0; x<classes.Length; x++) { var hit = false; for (var z = 0; z<foundClasses.length; z++) { if(foundClasses[z]==classes[x]) { hit=true; } } //if there was not a hit if(!hit) { foundClasses[classCounter]=classes[x]; classCounter++; output+="&" + classes[x] + "="; } } } } } } chrome.runtime.sendMessage({data: output}); background.js: var output2; chrome.extension.onMessage.addListener(function(request, sender, sendResponse) { output2 = "text_input1="; output2 += request.data; }); chrome.browserAction.onClicked.addListener(function() { chrome.tabs.create({url: "http://www.google.com?" + output2}, function(tab) { chrome.tabs.executeScript(tab.id, {file: "content.js"}, function() { sendMessage(); }); }); }); Does anyone know why the input tags values are passed as blank?
Because you're trying to get the input text by using current[z].innerText. However, you have to use current[z].value for inputs.