{"id":2458,"date":"2026-08-28T14:57:39","date_gmt":"2026-08-28T18:57:39","guid":{"rendered":"https:\/\/blogs.uscupstate.edu\/tip\/?page_id=2458"},"modified":"2026-08-28T14:57:39","modified_gmt":"2026-08-28T18:57:39","slug":"blackboard-photo-roster-bookmarklet","status":"publish","type":"page","link":"https:\/\/blogs.uscupstate.edu\/tip\/blackboard-photo-roster-bookmarklet\/","title":{"rendered":"Blackboard Photo Roster Bookmarklet"},"content":{"rendered":"<!doctype html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n<title>Blackboard Photo Roster Bookmarklet<\/title>\n<style>\nbody { .bookmarklet { display:inline-block; margin:18px 0; padding:14px 20px; border:2px solid #222; border-radius:10px; background:#f7f7f7; color:#111; text-decoration:none; font-weight:700; cursor:grab; }\n.note { background:#f4f4f4; padding:14px 16px; border-radius:10px; }\nol { padding-left: 24px; }\n<\/style><\/head>\n<body>\n<p>This bookmarklet creates a temporary large-photo roster from a Blackboard Ultra roster page. It does not modify Blackboard data; refreshing the page restores the normal view. You may also print a copy of your photo roster to help with attendance or learning student names<\/p>\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" src=\"https:\/\/blogs.uscupstate.edu\/tip\/wp-content\/uploads\/Blackboard-Photo-Roster.png\" alt=\"Screenshot of Blackboard Photo Roster View with print and close options, student photos, student names, and pronunciations.\" class=\"wp-image-2336\"\/><figcaption class=\"wp-element-caption\">AI-Enhanced Solution: Blackboard Photo Roster<\/figcaption><\/figure>\n\n<h1>How to Use the Blackboard Photo Roster Bookmarklet<\/h1>\n<p><strong>Drag this button to your bookmarks bar:<\/strong><\/p>\n<p><a class=\"bookmarklet\" href=\"javascript:(()=&gt;{const old=document.getElementById(&#x27;bb-photo-roster-overlay&#x27;);if(old)old.remove();const selector=[&#x27;img.MuiAvatar-img&#x27;,&#x27;img[src*=&quot;\/avatar\/user\/&quot;]&#x27;,&#x27;user-avatar-view img&#x27;,&#x27;[class*=&quot;Avatar&quot;] img&#x27;].join(&#x27;,&#x27;);const imgs=[...document.querySelectorAll(selector)].filter(img=&gt;(img.currentSrc||img.src||&#x27;&#x27;).length&gt;0);const unique=[];const seen=new Set();for(const img of imgs){const src=img.currentSrc||img.src||img.getAttribute(&#x27;src&#x27;)||&#x27;&#x27;;if(!seen.has(src)){seen.add(src);unique.push(img);}}const studentImgs=unique.slice(1);const overlay=document.createElement(&#x27;div&#x27;);overlay.id=&#x27;bb-photo-roster-overlay&#x27;;const printStyle=document.createElement(&#x27;style&#x27;);printStyle.textContent=&#x27;@media print{body>*{display:none!important;}#bb-photo-roster-overlay{display:block!important;position:static!important;overflow:visible!important;padding:0!important;margin:0!important;}#bb-photo-roster-overlay button{display:none!important;}}&#x27;;document.head.appendChild(printStyle);Object.assign(overlay.style,{position:&#x27;fixed&#x27;,inset:&#x27;0&#x27;,background:&#x27;#fff&#x27;,zIndex:&#x27;2147483647&#x27;,overflow:&#x27;auto&#x27;,padding:&#x27;16px&#x27;,boxSizing:&#x27;border-box&#x27;});const top=document.createElement(&#x27;div&#x27;);top.style.cssText=&#x27;display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap;&#x27;;const title=document.createElement(&#x27;div&#x27;);title.textContent=`Photo roster: ${studentImgs.length} students`;title.style.cssText=&#x27;font:600 20px system-ui,sans-serif;&#x27;;const close=document.createElement(&#x27;button&#x27;);close.textContent=&#x27;Close&#x27;;close.style.cssText=&#x27;padding:8px 12px;border:1px solid #ccc;border-radius:8px;background:#f7f7f7;cursor:pointer;&#x27;;close.onclick=()=&gt;overlay.remove();const print=document.createElement(&#x27;button&#x27;);print.textContent=&#x27;Print&#x27;;print.style.cssText=&#x27;padding:8px 12px;border:1px solid #ccc;border-radius:8px;background:#f7f7f7;cursor:pointer;&#x27;;print.onclick=()=>window.print();const grid=document.createElement(&#x27;div&#x27;);grid.style.cssText=&#x27;display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:16px;&#x27;;function extractNameAndPronunciation(rowText,fallbackIndex){const lines=rowText.split(&#x27;\\n&#x27;).map(s=&gt;s.trim()).filter(Boolean).filter(s=&gt;s!==&#x27;&#8230;&#x27;&amp;&amp;s!==&#x27;\u2026&#x27;);const name=(lines.find(t=>t.length>1&#038;&#038;t.length<60&#038;&#038;!\/^Instructor$\/i.test(t)&#038;&#038;!\/^Instructor.*$\/i.test(t)&#038;&#038;!\/^Photo roster\/i.test(t)&#038;&#038;!\/^Close$\/i.test(t))||`Student ${fallbackIndex+1}`).replace(\/([a-z])([A-Z])\/g,'$1 $2');const pronunciation=lines.find(t=&gt;\/rhymes with\/i.test(t)||\/\\(.*\\)\/.test(t)||\/pronunciation\/i.test(t))||&#x27;&#x27;;return {name,pronunciation};}studentImgs.forEach((img,index)=&gt;{const row=img.closest(&#x27;li,[role=&quot;listitem&quot;],.MuiListItem-root,.MuiAccordionDetails-root&#x27;)||img.parentElement;const rowText=row?.innerText||&#x27;&#x27;;if(\/instructor\/i.test(rowText))return;const nameElement=row.querySelector(&#x27;bdi&#x27;);const pronunciationElement=row.querySelector(&#x27;bdi[class*=&quot;pronunciation&quot;]&#x27;);const name=nameElement?nameElement.textContent.trim():`Student ${index+1}`;const pronunciation=pronunciationElement?pronunciationElement.textContent.trim():&#x27;&#x27;;const card=document.createElement(&#x27;div&#x27;);card.style.cssText=&#x27;border:1px solid #ddd;border-radius:14px;padding:16px;text-align:center;box-sizing:border-box;&#x27;;const clone=document.createElement(&#x27;img&#x27;);clone.src=img.currentSrc||img.src||img.getAttribute(&#x27;src&#x27;)||&#x27;&#x27;;clone.alt=name;clone.loading=&#x27;eager&#x27;;clone.style.cssText=&#x27;width:200px;height:200px;object-fit:cover;border-radius:50%;display:block;margin:0 auto 12px auto;&#x27;;const label=document.createElement(&#x27;div&#x27;);label.style.cssText=&#x27;display:block;font:600 16px system-ui,sans-serif;line-height:1.25;margin-bottom:12px;&#x27;;label.textContent=name;card.append(clone,label);if(pronunciation){const pron=document.createElement(&#x27;div&#x27;);pron.textContent=pronunciation;pron.style.cssText=&#x27;display:block;font:400 13px system-ui,sans-serif;color:#666;&#x27;;card.append(pron);}grid.append(card);});top.append(title,print,close);overlay.append(top,grid);document.body.appendChild(overlay);})()\">Blackboard Photo Roster<\/a><\/p>\n\n<h2>Install<\/h2>\n<ol>\n<li>Show your browser&#8217;s bookmarks bar if it is hidden.<\/li>\n<li>Drag the <strong>Blackboard Photo Roster<\/strong> button above onto the bookmarks bar. If you use a keyboard or screen reader, right-click the link to the Blackboard Photo Roster button, choose Copy Link Address, then create a new bookmark in the way best suited to your browser and paste the copied javascript: URL into the bookmark&#8217;s address field.<\/li>\n<\/ol>\n\n<h2>Use<\/h2>\n<ol>\n<li>Go to a Blackboard Ultra course. <\/li>\n<li>Open your Blackboard Ultra course roster.<\/li>\n<li>Make sure the roster has loaded. Scroll through it first to ensure that all students have loaded.<\/li>\n<li>Click <strong>Blackboard Photo Roster<\/strong> on your bookmarks bar.<\/li>\n<li>Click <strong>Close<\/strong> in the photo roster to return to Blackboard, or refresh the page.<\/li>\n<\/ol>\n\n<div class=\"note\"><strong>Note:<\/strong> Instructors are omitted from the student photo roster.<\/div>\n<\/body>\n<\/html>","protected":false},"excerpt":{"rendered":"<p>Blackboard Photo Roster Bookmarklet This bookmarklet creates a temporary large-photo roster from a Blackboard Ultra roster page. It does not modify Blackboard data; refreshing the page restores the normal view. You may also print a copy of your photo roster to help with attendance or learning student names How to Use the Blackboard Photo Roster &hellip; <a href=\"https:\/\/blogs.uscupstate.edu\/tip\/blackboard-photo-roster-bookmarklet\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Blackboard Photo Roster Bookmarklet<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-2458","page","type-page","status-publish","hentry","no-featured-image"],"_links":{"self":[{"href":"https:\/\/blogs.uscupstate.edu\/tip\/wp-json\/wp\/v2\/pages\/2458","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.uscupstate.edu\/tip\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/blogs.uscupstate.edu\/tip\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.uscupstate.edu\/tip\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.uscupstate.edu\/tip\/wp-json\/wp\/v2\/comments?post=2458"}],"version-history":[{"count":7,"href":"https:\/\/blogs.uscupstate.edu\/tip\/wp-json\/wp\/v2\/pages\/2458\/revisions"}],"predecessor-version":[{"id":2465,"href":"https:\/\/blogs.uscupstate.edu\/tip\/wp-json\/wp\/v2\/pages\/2458\/revisions\/2465"}],"wp:attachment":[{"href":"https:\/\/blogs.uscupstate.edu\/tip\/wp-json\/wp\/v2\/media?parent=2458"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}