The city scored poorly in the living conditions, infrastructure and customer satisfaction categories.
By Michael Karlis on Wed, Jan 25, 2023 at 12:12 pm
[ { “name”: “Real 1 Player (r2) – Inline”, “component”: “27560945”, “insertPoint”: “3”, “requiredCountToDisplay”: “5” },{ “name”: “Air Ad – NativeInline – Injected”, “component”: “27688470”, “insertPoint”: “2/3”, “requiredCountToDisplay”: “9” } ] click to enlarge
Michael Karlis
Houston took the spot as the dirtiest city in he nation, and ranked as having the No. 3 worst air quality in the U.S.
Whether it’s abandoned cars on the side of I-10, rubbish collecting at underpasses or litter washing up on the banks of the San Antonio River, our city has a garbage problem.
Indeed, a new study names San Antonio as the nation’s seventh-dirtiest city.
Researchers for online lawn care service LawnStarter ranked the largest 150 U.S. cities on how filthy they are by analyzing metrics including pollution, living conditions, infrastructure and consumer satisfaction.
San Antonio scored exceptionally low under the study’s living conditions category, which measures things such as the number of overcrowded homes, the share of homes with no plumbing and the number of unhoused residents.
The Alamo City also ranked well below average when it comes to infrastructure and consumer satisfaction, which measures things such as tons of waste in landfills and the share of residents dissatisfied with garbage disposal.
However, although San Antonio had 19 Ozone Action Days last year — meaning that air quality levels within the city were deemed unsafe for high-risk individuals by Environmental Protection Agency standards — San Antonio only ranked No. 34 in the air quality category.
Instead, Houston was among cities with the worst air quality, coming in as the dirtiest city in the U.S. overall. No other Texas cities made the top 25 in that category.
On the other end of the spectrum, Virginia Beach took the title as the cleanest U.S. city.
Follow us: Google News | NewsBreak | Instagram | Facebook | Twitter
or tag and empty text nodes as children let isPHeader = false; if (currentNodeIsP && currentNode.childNodes.length >= 3) { let textNodesHaveText = false; let brStrongElementCount = 0; let otherElementCount = 0; currentNode.childNodes.forEach((item)=> { if (item.nodeType === Node.TEXT_NODE) { if (item.nodeValue.trim() !== ”) { textNodesHaveText = true; } } else if (item.nodeType === Node.ELEMENT_NODE) { if (item.nodeName.match(/^B|STRONG$/i) !== null) { brStrongElementCount++; } else { otherElementCount++; } } }) if (brStrongElementCount === 1 && textNodesHaveText === false && otherElementCount === 0) { isPHeader = true; } } let isParagraphBreak = prevNodeIsNotBlock && currentNodeIsP && !isPHeader; if (isParagraphBreak) { return true; } } return false; } let myParagraphTool = this this.paragraphEndNodes = myParagraphTool.bodyContainer.first().contents().filter(function(index, element) { let isText = this.nodeType === Node.TEXT_NODE; let isElement = this.nodeType === Node.ELEMENT_NODE; // Empty text node. Move on if (isText && this.nodeValue.trim() === ”) { return false; } let currentNode = this; if (myParagraphTool.isParagraphBreak(currentNode)) { return true; } if (myParagraphTool.isDoubleBrParagraphBreak(currentNode)) { return true; } if (myParagraphTool.isBrParagraphBreakBeforeBlockElement(currentNode)) { return true; } return false; }) this.getParagraphEndNodeCount = function () { return this.paragraphEndNodes.length; } this.insertElemenAtIndex = function (element, index) { let isValidIndex = index < this.paragraphEndNodes.length; if (isValidIndex) { let currentNode = this.getNodeAtIndex(index); if (this.isDoubleBrParagraphBreak(currentNode)) { if (jQuery(element).get(0).tagName.match(/SCRIPT/i) !== null) { jQuery('
‘).insertAfter(this.paragraphEndNodes[index]); jQuery(‘
‘).insertAfter(this.paragraphEndNodes[index]); } else { jQuery(‘div.fdn-content-body’).append(‘ ]]>‘) let lineHeight = jQuery(‘[line-height-check]’).get(0).clientHeight; jQuery(‘[line-height-check]’).remove() if (jQuery(element).prop(‘tagName’).match(/HIDDEN/i) !== null) { jQuery(element).children(‘div’).last().css({ marginBottom: `${lineHeight*2}px` }); } else { jQuery(element).css({ marginBottom: `${lineHeight*2}px` }); } } } jQuery(element).insertBefore(this.paragraphEndNodes[index]); } else { console.warn(‘Foundation.ParagraphTool.insertElemenAt: invalid insertion index’, index); } } this.getNodeAtIndex = function (index) { return this.paragraphEndNodes[index]; } } {ngoogletag.cmd.push(function() {nFoundation.Ad.showAd(currentElement);n});n}, 200);n});nn”, }]; Foundation.Content[‘30886777’].setupInlineComponents = function (callback) { setTimeout(() => { let contentBody = jQuery(‘[fdn-content-multi-item=”30886777″] .fdn-content-body’); // For multiple content scenarios if (contentBody.length) { Foundation.Content[‘30886777’].paragraphTool = new window.Foundation.ParagraphTool(contentBody); } // Assume only a single content else { contentBody = jQuery(‘.fdn-content-body’); Foundation.Content[‘30886777’].paragraphTool = new window.Foundation.ParagraphTool(contentBody); } var myParagraphTool = Foundation.Content[‘30886777’].paragraphTool Foundation.Content[‘30886777’].inlineComponents.forEach((item,index) => { if (item.parentWrapperClass.trim() === ”) { var componentElement = jQuery(item.componentHtml); } else { var componentElement = jQuery(`${item.componentHtml}]]>`); } var paragraphCount = myParagraphTool.getParagraphEndNodeCount(); // No need to insert if there aren’t enough paragaphs if (paragraphCount >= parseInt(item.requiredCountToDisplay)) { // Matches specific paragraph insertion indexes if (item.insertPoint.match(/^d+$/) !== null) { var insertIndex = parseInt(item.insertPoint) – 1; // Insert within content if (insertIndex < paragraphCount) { myParagraphTool.insertElemenAtIndex(componentElement, insertIndex); } // Append to the end if the insert point is beyond the paragraph count else { contentBody.append(componentElement); } } // Matches for 1/2, 1/4, 2/3, 5/6, etc else if (item.insertPoint.match(/^[1223456]/[23456]$/) !== null) { var fractionMatch = new RegExp(/^([123456])(?:/)([23456]$)/); var fractionPart = parseInt(item.insertPoint.match(fractionMatch)[1]); var fractionWhole = parseInt(item.insertPoint.match(fractionMatch)[2]); var fractionValue = fractionPart / fractionWhole; var fractionIndex = Math.floor(myParagraphTool.paragraphEndNodes.length * fractionValue) - 1; myParagraphTool.insertElemenAtIndex(componentElement, fractionIndex); } // Matches for every Nth insertion point else if (item.insertPoint.match(/^d*th$/i) !== null) { var intervalIndex = parseInt(item.insertPoint.match(/^(d*)th$/i)[1]); var startingIndex = item.startingPoint; for (var i = startingIndex; i < myParagraphTool.paragraphEndNodes.length; i++) { if ((i - startingIndex) % intervalIndex === 0) { let currentNode = myParagraphTool.getNodeAtIndex(i); myParagraphTool.insertElemenAtIndex(componentElement, i); } } } } }); Foundation.Content['30886777'].setupInlineComponents = function () { return true; }; if (typeof callback === 'function') { callback(); } }, 200); }
Scroll to read more San Antonio News articles
{ googletag.cmd.push(function() { Foundation.Ad.showAd(currentElement); }); }, 200); }); ]]>
{ googletag.cmd.push(function() { Foundation.Ad.showAd(currentElement); }); }, 200); }); ]]>
Join SA Current Newsletters
Subscribe now to get the latest news delivered right to your inbox.
{ googletag.cmd.push(function() { Foundation.Ad.showAd(currentElement); }); }, 200); }); ]]>
{ googletag.cmd.push(function() { Foundation.Ad.showAd(currentElement); }); }, 200); }); ]]>
{ googletag.cmd.push(function() { Foundation.Ad.showAd(currentElement); }); }, 200); }); ]]>
{ googletag.cmd.push(function() { Foundation.Ad.showAd(currentElement); }); }, 200); }); ]]>
{ googletag.cmd.push(function() { Foundation.Ad.showAd(currentElement); }); }, 200); }); ]]>
{ googletag.cmd.push(function() { Foundation.Ad.showAd(currentElement); }); }, 200); }); ]]>
{ googletag.cmd.push(function() { Foundation.Ad.showAd(currentElement); }); }, 200); }); ]]>
0 && boundingTop 0 && boundingBottom < viewThreshold var middleCoversView = boundingTop viewThreshold if (topInView || bottomInView || middleCoversView) { return true } return false } var updateFurthestDownInView = function () { var furthestInViewItem = null var furthestInViewIndex = 0 cmInstance.items.forEach(function (currentItem, index) { var currentInViewItem = jQuery(currentItem) // console.log(currentInViewItem) if (checkInView(currentInViewItem)) { if (furthestInViewItem === null) { furthestInViewItem = currentInViewItem furthestInViewIndex = index } else { var furthestInView = furthestInViewItem.position().top var currentInViewItemTop = currentInViewItem.position().top if (currentInViewItemTop > furthestInView) { furthestInViewItem = currentInViewItem furthestInViewIndex = index } } } }) if (furthestInViewIndex !== currentIndex) { currentIndex = furthestInViewIndex fireEvent(‘foundation:multiitem:itemchange’) } } var fetchUnloadedItems = function () { var itemContainer = jQuery(‘[‘ + contentLoaderAttr + ‘=”fetch”]’).first() if (itemContainer.length) { var contentOid = itemContainer.attr(contentOidAttr) var params = { ajaxComponent: ‘ContentRowMultiple’, loadItemOid: contentOid, itemIndex: jQuery(`${itemSelector}`).index(itemContainer[0]) + 1, } var presentResult = function (resultHTML, loaderValue, callback) { console.log(‘itemContainer’, itemContainer.attr(contentLoaderAttr)); if (loaderValue == ‘remove’) { itemContainer.removeAttr(contentLoaderAttr) } else { itemContainer.attr(contentLoaderAttr, loaderValue) } itemContainer.slideUp({ duration: 300, done: function () { // var resultElements = jQuery.parseHTML(resultHTML, document, true) itemContainer.empty().append(resultElements).slideDown({ duration: 300, done: function() { if (typeof callback === ‘function’) { setTimeout(() => { callback() }, 100) } }, }) }, }) } jQuery.ajax({ url: originUrl, type: ‘GET’, data: params, dataType: ‘json’, beforeSend: function () { presentResult(‘]]>
‘, ‘fetching’) }, success: function (data) { // console.log(data.result, data.error, data) if (data) { if (data.error) { // presentResult(‘Trouble loading content.’, ‘error’) } else if (data.result) { if (typeof Foundation.Content === ‘undefined’) { presentResult(data.result, ‘remove’); } else { presentResult(data.result, ‘remove’, () => { // Foundation.Content[contentOid].setupInlineComponents(); if (Foundation.Image.Editor && typeof Foundation.Image.Editor.setupEditButtons === ‘function’) { Foundation.Image.Editor.setupEditButtons(); } }); } } else { // presentResult(‘How did we get here?’, ‘error’) } } else { // presentResult(‘No result or error returned from content request.’, ‘error’) } }, complete: function () { cmInstance.queue.push(fetchUnloadedItems); }, error: function (error) { // presentResult(‘Ajax request error.’, ‘error’) } }) } } cmInstance.queue.push(fetchUnloadedItems) jQuery(document).on(‘scroll resize’, function () { // Prevent rapid firing of event stuff clearTimeout(onScrollTimeout) onScrollTimeout = setTimeout(function() { // console.log(‘Foundation.MultiItem onScroll event’) updateFurthestDownInView() }, 100); }) jQuery(document).on(‘foundation:multiitem:itemchange’, function () { // Prevent rapid firing of event stuff clearTimeout(onItemChangeTimeout) onItemChangeTimeout = setTimeout(function() { // console.log(‘Foundation.MultiItem foundation:multiitem:itemchange event ‘) cmInstance.onItemChange() }, 100); }) }; Foundation.MultiItems = Foundation.MultiItems || { add: function (multiItem) { Foundation.MultiItems[multiItem.id] = multiItem; } }; Foundation.MultiItems.add(new Foundation.MultiItem({ id: ‘ContentRowMultiple’, onItemChange: function () { if (this.currentPermaLink) { var state = {} var title = ” var url = this.currentPermaLink history.pushState(state, title, url) } if (this.currentCanonical) { document.querySelector(‘meta[property*=og\:url]’).href = this.currentCanonical document.querySelector(‘link[rel*=canonical]’).href = this.currentCanonical } if (this.currentThumb) { document.querySelector(‘link[rel*=image_src]’).href = this.currentThumb document.querySelector(‘meta[name*=thumbnail]’).content = this.currentThumb document.querySelector(‘meta[property*=og\:image]’).content = this.currentThumb document.querySelector(‘meta[name*=twitter\:image]’).content = this.currentThumb } if (this.currentTitle) { document.querySelector(‘title’).text = this.currentTitle } // Google track pageview if (typeof ga === ‘function’) { ga(‘set’, ‘location’, window.location.href) for (let i = 1; i <= 3; i++) { let currentDimension = jQuery(Foundation.MultiItems["ContentRowMultiple"].currentItem).attr('ga-dimension'+i) if (typeof currentDimension === 'string') { ga('set', 'dimension' + i, currentDimension) } else { ga('set', 'dimension' + i, '') } } ga('send', 'pageview') } if (typeof (Foundation.Ad.slots['SAC_LeaderboardHeader-1']) === 'object') { Foundation.Ad.refresh('SAC_LeaderboardHeader-1') } if (typeof (Foundation.Ad.slots['SAC_Footer-1']) === 'object') { Foundation.Ad.showFooter('SAC_Footer-1'); } } }))
GIPHY App Key not set. Please check settings